📅  最后修改于: 2023-12-03 15:01:40.664000             🧑  作者: Mango
闭包是 JavaScript 语言中的概念之一。它可以让我们在创建函数时,保存函数内部变量的状态,并且使得这些状态在之后仍然可以被访问和使用。换句话说,闭包是一种可以做到在内层函数访问外层函数的变量的方法。
JavaScript 中的闭包可以有多种形式,包括对象封装、循环、IIFE等等。下面分别介绍一下这些形式:
对象封装是一种常用的闭包形式。它的主要思想是将变量和函数封装在一个对象中,通过对象的属性和方法来访问和使用。
function person() {
var name = "John";
function getName() {
return name;
}
return {
getName: getName
}
}
var p = person();
console.log(p.getName()); // 输出 "John"
在上面的例子中,变量 name 和函数 getName 都被封装在了一个对象中。获取 name 的唯一方法是通过 getName 函数。在返回的对象被赋值给变量 p 后,getName 函数仍然可以访问闭包内的 name 变量。
循环也是 JavaScript 中常用的闭包形式。它的主要思想是在循环内部创建一个闭包,保存循环变量的值,以便在循环的回调函数中使用。否则,在循环内部定义的回调函数中使用的变量都将指向循环结束时的最后一个值。
for (var i = 0; i < 5; i++) {
setTimeout((function(index) {
return function() {
console.log(index);
}
})(i), 1000);
}
在上面的例子中,我们通过立即调用函数创建了一个闭包,保存了循环变量 i 的值。这样在 setTimeout 的回调函数中,就可以使用正确的值了。
IIFE(Immediately-Invoked Function Expression)是一种立即调用的匿名函数表达式。它的主要思想是通过创建一个闭包,将变量和函数的作用域限制在函数内部,并且在函数内部执行代码。
var count = (function() {
var i = 0;
return function() {
return ++i;
}
})();
console.log(count()); // 输出 1
console.log(count()); // 输出 2
console.log(count()); // 输出 3
在上面的例子中,我们通过 IIFE 创建了一个闭包,保存了变量 i 的值。闭包内的函数每次调用都会返回 i 的自增值。在函数外部,我们只能使用返回的函数,不能直接访问 i 的值。
以上是三种常用的 JavaScript 闭包形式。在实际开发过程中,我们需要根据具体需要选择使用哪种形式。