哈士奇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
提交
取消
