要理解闭包,先要理解JS的变量作用域,简单地说,就是函数内部可以直接读取全局变量,函数外部无法读取函数内的局部变量。
所以,问题来了,怎么样才能在函数外部读取到函数内部的变量??
可以使用如下方法:
function f1(){
var n = 999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result() ==> 999
也可以这么写:
function f1(){
var n = 999;
return function(){
alert(n)
}
}
var result = f1();
result() ==> 999
上面代码中的f2函数,就是闭包。
那么,闭包的概念是啥呢?
简单地说,就是能够读取其他函数内部变量的函数。
但是,闭包有什么用呢?
主要有两点:
(1) 可以读取函数内部的变量
(2) 让这些变量的值始终保持在内存中
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
最后留下两个思考题:
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); ==> "The Window"
提示:匿名函数内部的this指向是window
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); ==> "My Object"
讲完结束,原文来源于阮一峰大神的笔记
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html