closures 是js的特色,它的本质即一个函数+这个函数生成的上下文环境。
我们以下面的代码为例来讲解closures
var count = 0;
function getCounter(){
var count = 0;
return function(){
count++;
};
}
var counter = getCounter();
var result = counter();
当我们调getCounter()
时,返回的是什么呢?
答: 返回的是一个匿名函数。
那么该匿名函数返回后,我们调用它时,其中使用的count是全部变量中的count,还是getCounter中的局部变量count? 因为我们知道局部变量在函数执行完之后就会清空,所以在我们执行counter() 的时候,好像局部变量已经被清掉了,所以好像应该是全局的count, 对不对?
答: 不对。getCounter()返回的起始不止是一个匿名函数,该匿名函数在声明的时候,其中有个count变量,不是它的局部变量,也不是参数,我们称这种变量为free variable. 当返回的函数包含free variable的时候,我们会对该返回函数创建一个environment,来存储其用到的free varibale,这些freevariable,由于不是该函数创建的,我们就会去上一层找改变量,这里即去getCounter找,如果找到则使用,如果没找到,则去再上一层找,知道全部变量,如果仍然没找到则认为是undefined.
所以当调用getCounter() 的时候,其返还的是 匿名函数+ 改函数中free variable所在的environment.
这样,当我们执行该函数时,引用和修改的变量都是environment中的变量;
所以, closures = function + envrionment, 没什么神秘的!
网友评论