2015-05-09 123 views
1

我認爲這是一個愚蠢的問題,但考慮到這段JavaScript代碼....困惑的JavaScript關閉工作原理

function outerFun() 
{ 
var a=0; 
function innerFun() 
{ 
    a++; 
    alert(a); 
} 
return innerFun; 
} 
var obj=outerFun(); 
obj(); //1 
obj(); //2 
var obj2=outerFun(); 
obj2(); //1 
obj2(); //2 

我明白爲什麼結果是前兩個電話1,然後2的obj(),但我很困惑,爲什麼obj2()返回1而不是在調用obj()兩次後返回3。

+0

如果答案解決了您的問題,您可以[單擊該答案上的複選標記以將問題標記爲已解決](http://meta.stackexchange.com/q/5234)。 – apsillers

回答

0

當你在做outerfun()秒時間,新a與值0

+0

更新了答案。 – Guanxi

3

因爲每次調用outerFun()時候,你正在創建一個不同的新的執行上下文定義的,因此innerFun是不是真的一樣事情,因爲您從outerFun返回的innerFun的每個函數引用都處於不同的上下文中,而上下文有其自己的變量。

function outerFun() 
{ 
var a=0; 
function innerFun() 
{ 
    a++; 
    alert(a); 
} 
return innerFun; 
} 
var obj = outerFun(); 
var obj2 = outerFun(); 
console.log(obj === obj2); 
// Not equal, because innerFun is a different innerFun for each function call, 
// as it is the same function name, returned from the same function, 
// but in a different context. 
obj(); //1 
obj(); //2 
obj2(); //1 
obj2(); //2 

// Call obj twice, it'll increase to 4. 
// While calling obj2 once again, leaves it at 3. 
// This way you can know that obj and obj2 are not modifying 
// the same variables. 
// They are independent of each other. 
obj(); // 3 
obj(); // 4 
obj2(); // 3 
+1

謝謝,它可以幫助我 – cryst

1

當您運行outerFun()時,它會創建一個新函數並將其返回。每當你打電話時都會這樣做。而且它返回的每個函數實際上都是一個全新的函數,與之前調用的函數無關,即使它們內部的代碼是相同的。

當你達到本聲明

var obj2=outerFun(); 

...你實際上是創建具有其自己的a副本其父範圍的新對象。所以你實際上得到三個,如果你在實例化obj2後再次調用obj();。他們每個人都有自己的a變量。希望這個例子的修改是有道理的:

function outerFun() 
{ 
    var a=0; 
    function innerFun() 
    { 
     a++; 
     alert(a); 
    } 
    return innerFun; 
} 
var obj=outerFun(); 
obj(); //1 
obj(); //2 
var obj2=outerFun(); 
obj(); //3 
obj(); //4 
obj2(); //1 
obj2(); //2 
obj(); //5 

有意義嗎?

+0

是的,謝謝。 – cryst