概念
闭包是指有权访问另一个函数作用域中中的变量的函数,最常见的方式就是在一个函数中创建另一个函数,例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function getFunctions() {
var functions = new Array();
for(var i = 0; i < 10; i++) {
functions[i] = function() {
return i;
}
}
return functions;
}
var array = getFunctions(); //每个函数都保存了getFunctions的活动对象,所以每个函数访问的变量都是同一个
console.log(array[0]()); //10
console.log(array[0]()); //10
this对象
在闭包中,this对象的实际效果可能会与想法不一致,例如:1
2
3
4
5
6
7
8
9
10
11
12
13var name = "ddd";
var object = {
name: "object",
getName: function() {
return function() {
return this.name;
}
}
}
console.log(object.getName()()); //ddd
导致这样的结果是由于返回的一个匿名函数,而匿名函数的执行环境具有全局性,即this指向window,解决此问题的办法是在返回匿名函数前将this赋值给变量,因为此时的this在作用域中引用的是object,如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14var name = "ddd";
var object = {
name: "object",
getName: function() {
var that = this;
return function() {
return that.name;
}
}
}
console.log(object.getName()()); //object
内存泄漏风险
由于闭包会一直引用包含闭包的函数的活动对象,因此处理不当将会导致一些已使用完的垃圾不能被收回,解决方法是显式的将一些变量置为null