2016-01-23 55 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一次只有一個值。