JavaScript 闭包

闭包(closure)就是能够读取其他函数内部变量的函数。闭包是在某个作用域内定义的函数,它可以访问这个作用域内的所有变量。闭包主要有两个作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。

特点

1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收

闭包作用域链

1.函数本身作用域。
2.闭包定义时的作用域。
3.全局作用域。

创建函数的方法

在JavaScript中创建函数的方法有两种:函数声明和函数表达式,写法如下:

1
2
3
4
5
// 方法一:函数声明
function foo() {}

// 方法二:函数表达式
var foo = function() {};

还有一种自执行函数表达式,主要用于创建一个新的作用域,在此作用域内声明的变量不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行:

1
2
3
(function() {

})();

此种自执行函数表达式归类于以上两种方法的第二种,也算是函数表达式。

闭包案例

1
2
3
4
5
6
7
8
9
10
11
function testVarible() {
var num = 666;
return function() {
debugger;
num++;
return num;
}
}

var testNum = testVarible();
testNum(); // 667

上记代码说明变量num没有随着函数调用完后而消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var arr = [];
function createClosure(n) {
return function() {
return 'n = ' + n;
}
}

for (var index = 0; index < 10; index++) {
arr[index] = createClosure(index);
}

for (var index in arr) {
console.log(arr[index]());
}

上记代码闭包代码createClosure()方法会在每次循环中调用,每次循环的时候就会产生新的作用域,就会产生10个不同的作用域,最后的结果就是n=0,n=1,n=2,…,n=9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var arr = [];

function createClosure() {
for (var index = 0; index < 10; index++) {
arr[index] = function() {
return 'n = ' + index;
}
}
}

createClosure();

for (var index in arr) {
console.log(arr[index]());
}

上记代码闭包代码createClosure()方法只调用一次,只有一个作用域,所以变量会是最后一次调用完后的值,最后的结果就是n=10,n=10,n=10,…,n=10

坚持原创技术分享,您的支持将鼓励我继续创作!