哈士奇WWW
2018-11-07 15:14:14
為什么變量 n 不會被重置?function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 說明變量 n 是個全局變量,是不是在 f2 中變量 n 被提升為了全局變量?
1 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
因為js會給每個函數調用創建一個棧,函數內的函數也可以訪問這個棧。
首先你能調用nAdd
,是因為你沒加var
,等于是在函數調用時定義了一個全局作用域下的nAdd
,你加上var
再這么寫會報錯。
你的var result=f1();
調用了函數f1
,也就創建了一個棧,保存了n=999
,并返回了f2
。之后你再怎么調用result()
,其實都是在調用同一個f2
,而這個f2
引用的外部棧,自然還是第一次調用f1
時候創建的那個。同樣的nAdd
雖然作用在全局,但訪問的也是同一個棧內的數據。
所以,并不是你說的因為nAdd是全局變量,所以n被提升成全局變量,而是nAdd所指向的函數和你返回的那個閉包根本是在訪問同一份數據。
你可以嘗試著改寫成
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
f1()(); // 調用f1,創建了一個棧,棧內n=999,創建了一個匿名函數,返回了一個閉包。
nAdd(); // 調用了那個匿名函數
f1()(); // 又調用f1,又創建了一個棧,棧內n=999,創建了另一個匿名函數,返回了另一個閉包。
添加回答
舉報
0/150
提交
取消