1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
因?yàn)閖s會(huì)給每個(gè)函數(shù)調(diào)用創(chuàng)建一個(gè)棧,函數(shù)內(nèi)的函數(shù)也可以訪問(wèn)這個(gè)棧。
首先你能調(diào)用nAdd
,是因?yàn)槟銢](méi)加var
,等于是在函數(shù)調(diào)用時(shí)定義了一個(gè)全局作用域下的nAdd
,你加上var
再這么寫(xiě)會(huì)報(bào)錯(cuò)。
你的var result=f1();
調(diào)用了函數(shù)f1
,也就創(chuàng)建了一個(gè)棧,保存了n=999
,并返回了f2
。之后你再怎么調(diào)用result()
,其實(shí)都是在調(diào)用同一個(gè)f2
,而這個(gè)f2
引用的外部棧,自然還是第一次調(diào)用f1
時(shí)候創(chuàng)建的那個(gè)。同樣的nAdd
雖然作用在全局,但訪問(wèn)的也是同一個(gè)棧內(nèi)的數(shù)據(jù)。
所以,并不是你說(shuō)的因?yàn)閚Add是全局變量,所以n被提升成全局變量,而是nAdd所指向的函數(shù)和你返回的那個(gè)閉包根本是在訪問(wèn)同一份數(shù)據(jù)。
你可以嘗試著改寫(xiě)成
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
f1()(); // 調(diào)用f1,創(chuàng)建了一個(gè)棧,棧內(nèi)n=999,創(chuàng)建了一個(gè)匿名函數(shù),返回了一個(gè)閉包。
nAdd(); // 調(diào)用了那個(gè)匿名函數(shù)
f1()(); // 又調(diào)用f1,又創(chuàng)建了一個(gè)棧,棧內(nèi)n=999,創(chuàng)建了另一個(gè)匿名函數(shù),返回了另一個(gè)閉包。
添加回答
舉報(bào)