闭包
1.定义:JS高程中解释为:有权访问另一个函数作用域中变量的函数。
2.本质:执行环境都有一个表示变量的对象(变量对象),在闭包内保存有外部环境的变量对象。
3举例说明:
A:参考阮一峰的个人博客的例子:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
刚看这个例子的时候,脑海有个问题,为什么要有一个return呢。首先,我们需要分辨f和f()的区别,f()代表的是函数调用,f是指向这个函数的变量。
再看这个例子 var result=f1();代表的是f1()运行后的return值,即f2,然后result(),即再次运行f2()。而f2可以访问外部的n。所以得到了结果999.
B:JS高程71页
function createFunction(){
var result=[];
for(var i=0;i<10;i++){
result[i]=function(){
return i;
};
}
return result;
}
在这个例子中,内部function(){return i;}保存的是整个变量对象,所以i的值取得的是最后一个值10;
function createFunction(){
var result=[];
for(var i=0;i<10;i++){
result[i]=function(num){
return num;
}(i);
}
return result;
}
在下面,增加了自运行函数result[i]=function(num){}(i),参见司徒正美博客,里面介绍的自运行函数很全面。因为i是在外面赋值给num,所以成功的得到了想要的结果。
另外书上的这个例子多了一个内部函数。