闭包
一些其他概念
作用域链
以自己所在的环境为链的前端,链的下一对象为上层函数的变量对象,一直到全局变量域。所以全局变量域始终会在一个作用域链的结尾。
当寻找变量时,始终会沿着作用域链来查找,从链的前端开始,没有就在下一对象找,直到达到链尾。
垃圾回收机制
当一个函数执行完成后,会回收函数的内存空间,当一个变量没有任何指针指向时,也会被回收。
闭包概念
闭包:能够读取其他函数内部变量的函数
也就是定义在一个函数内部的函数,这个内部的函数持有外部函数变量的引用。
所以结合上面所说到的垃圾回收机制,闭包能防止外层函数的变量被回收。
闭包可以让你从内部函数访问外部函数作用域。在 JavaScript 中,每当函数被创建,就会在函数生成时生成闭包。 ———MDN
简单的闭包案例
function foo () {
var a = 1;
return function () {
console.log(a);
};
}
fn1 = foo();
fn1();
1
通过设置断点来观察闭包的产生
在调用fn1的时候产生了闭包
阮一峰老师的思考题(this和闭包)
代码片段1:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
运行结果: The Window
代码片段2:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
运行结果: My Object
注意this始终指向他的owner(箭头函数的this看他的外层函数),第二段代码在调用getNameFunc函数返回的函数时,产生了闭包,访问到了其外层函数的that变量。
闭包的弊端
由于闭包可以访问外层函数的变量,所以垃圾回收机制无法回收掉外层函数的内存空间。这就说明如果滥用闭包,会消耗大量的内存。