直接上代码代码简单
function Foo(){
var i=0;
return function(){
document.write(i++);
}
}
var f1=Foo(),
f2=Foo();
f1();
f1();
f2();
问题,被引入到外部作用域是如果保存的,答案是010,f1和f2如何实现的隔离,如果有图的话就更好了;我觉得大部分网上关于闭包都讲得太抽象,不够具体和直接
i这个变量到底保存在哪个作用域,f2、f1不指向一个函数作用域么
你要的图来了!
1. 刚定义完函数
Foo
时:2. 所有代码执行完时:
3. 说明一下:
问题的关键时:
(1) 函数在执行期间会产生一个执行上下文(EC),作为函数的运行时表示,函数返回时此上下文销毁。所以很函数
Foo
被调用了两次必然产生两个不同的执行上下文。(2) 执行上下文中有个叫做词法环境(LE)的东西,用来存放函数执行时产生的局部变量、this等东西。函数
Foo
里面的局部变量i
就放在词法环境LE里面。(3) 函数返回后,执行上下文销毁了,但是词法环境还是可以存在的,所以你要问
i
存放在哪里?不错,就在词法环境里面。(4) 函数里面定义的内部函数总是有一个内部指针(即图中的[[scope]])指向外部词法环境。所以f1和f2可以引用它们的外部词法环境中的各自的
i
变量,并对它们进行操作。如果还有什么不明白的,可以留言。
注:为了方便理解,图中某些地方进行了简化,但是本质没有变化。