這是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從封閉。?
如果事情是錯誤的,我的理解,請幫我...
每個閉包都是一個單獨的對象,並且完全可以訪問其範圍內的'y'變量。請注意,在多個作用域(每次調用IEFE創建的)中都有多個'y'變量(具有不同的值)。 – Bergi
@Bergi我可以想一想,每一輪推動創建一個容器(封閉)在.push被調用並將所有局部變量放入它並將該容器的引用傳遞給函數get push? – Kuan
是的,但是*範圍*(IIFE)是容器,函數(帶有引用)就是所謂的「閉包」。 – Bergi