2016-01-23 59 views
2

这是JS Closure概念的代码示例。JavaScript关闭。 JS引擎如何选择闭包变量?

function buildFunctions() { 
     var arr = []; 
     for (var i = 0; i < 3; i++) { 
      arr.push((function(j) { 
       return function() { 
        console.log(j); 
       } 
      }(i))); 
     } 
     return arr; 
    } 
    var fn = buildFunctions(); 
    fn[0](); 
    fn[1](); 
    fn[2](); 

在此代码我知道当环开始运行并为每个“I”值(对于每个IIFE)与变量J个新的执行上下文= 1,2,3将分别在JS引擎创建的。因此,当循环结束时,来自3 IIFE的三个返回函数将位于变量arr中,并且各个IIFE的执行上下文将消失,但在闭包中仍然具有j = 1,2,3的可变环境。所以,现在的ARR将具有

var arr = [function{console.log(j)},function{console.log(j)},function{console.log(j)}] 

我的问题是如何这些函数的阵列中的调用,fn[0]()镐J = 0,fn[1]()拾取J = 1,fn[2]()镐Ĵ分别= 2从封闭。?

如果事情是错误的,我的理解,请帮我...

+1

每个闭包都是一个单独的对象,并且完全可以访问其范围内的'y'变量。请注意,在多个作用域(每次调用IEFE创建的)中都有多个'y'变量(具有不同的值)。 – Bergi

+0

@Bergi我可以想一想,每一轮推动创建一个容器(封闭)在.push被调用并将所有局部变量放入它并将该容器的引用传递给函数get push? – Kuan

+0

是的,但是*范围*(IIFE)是容器,函数(带有引用)就是所谓的“闭包”。 – Bergi

回答

3

当循环结束[...]的各自IIFE的执行环境将会消失

好,他们不走了 - 这是point of closures
每个闭包都保留了它在活动中创建的上下文 - 因此,每个函数都具有相应值的和之间的变量j的引用。

1

功能记录的j值。

j的值是作为参数传递给外部匿名函数的值。

该函数被调用(立即)作为i的值时指定。

i一次只有一个值。