摘要:高級(jí)程序設(shè)計(jì)里面有這么一段話(huà)在里面當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)的時(shí)候,函數(shù)的環(huán)境會(huì)被推入到一個(gè)環(huán)境棧里面,函數(shù)執(zhí)行結(jié)束后又會(huì)將環(huán)境彈出。而,即,實(shí)際是一直引用著里面的變量,所以一直不會(huì)被清空。
先看一下這個(gè)例子。
function box(){ var a=1; return function(){ a++; alert(a); } } box()();//2 box()();//2 var c=box(); c();//2 c();//3
很久前在知乎碰到了這個(gè)問(wèn)題,當(dāng)時(shí)實(shí)在是不知道怎么完全解釋?zhuān)髞?lái)重新翻看《javascript高級(jí)程序設(shè)計(jì)》的時(shí)候才恍然大悟。
我的理解是可以用執(zhí)行環(huán)境來(lái)解釋。
《javascript高級(jí)程序設(shè)計(jì)》里面有這么一段話(huà):“在js里面當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)的時(shí)候,函數(shù)的環(huán)境會(huì)被推入到一個(gè)環(huán)境棧里面,函數(shù)執(zhí)行結(jié)束后又會(huì)將環(huán)境彈出。”
這樣前兩個(gè)box()()實(shí)際上每次執(zhí)行的時(shí)候,函數(shù)環(huán)境都被推入到棧里面,結(jié)束后又會(huì)被彈出,首先是box環(huán)境被推入棧中,然后里面閉包函數(shù)環(huán)境推入到棧中,執(zhí)行結(jié)束后會(huì)先彈出閉包的環(huán)境,再?gòu)棾鯾ox的環(huán)境,所以?xún)蓚€(gè)互不影響,都是2。
但是c=box()的時(shí)候,因?yàn)閏一直保持著box()的執(zhí)行,所以box的執(zhí)行環(huán)境一直在棧中,后面兩個(gè)c()運(yùn)行的時(shí)候,會(huì)推入閉包的執(zhí)行環(huán)境,執(zhí)行c()結(jié)束后才彈出閉包的執(zhí)行環(huán)境,實(shí)際上box這個(gè)執(zhí)行環(huán)境一直還在棧中,所以a就都在同一個(gè)執(zhí)行環(huán)境里面了。
后來(lái)我請(qǐng)教了一下在百度工作的師兄,他的解釋是這樣的:
每個(gè)函數(shù)的作用域都是獨(dú)一無(wú)二的,函數(shù)執(zhí)行完后里面的東西都會(huì)清空,所以box()()執(zhí)行兩次后都是2。
而c,即box(),實(shí)際是一直引用著box里面的a變量,所以一直不會(huì)被清空。
這個(gè)類(lèi)似于:
var a=1; function c(){ a++; alert(a); } c(); //2 c(); //3
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87879.html
摘要:高級(jí)程序設(shè)計(jì)里面有這么一段話(huà)在里面當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)的時(shí)候,函數(shù)的環(huán)境會(huì)被推入到一個(gè)環(huán)境棧里面,函數(shù)執(zhí)行結(jié)束后又會(huì)將環(huán)境彈出。而,即,實(shí)際是一直引用著里面的變量,所以一直不會(huì)被清空。 先看一下這個(gè)例子。 function box(){ var a=1; return function(){ a++; alert(a); } } box()();//2 box()();//2 var ...
摘要:而為對(duì)象時(shí),可用選項(xiàng)如下之所以第三個(gè)參數(shù)有兩種形態(tài),是在舊版本中只存在一個(gè)布爾值,即屬性但隨著時(shí)間推移以及發(fā)展的需要,需要支持設(shè)置更多的特性設(shè)置,所以有了選項(xiàng)這個(gè)對(duì)象傳參,又為了兼容以前的老程序,所以對(duì)兩者進(jìn)行了兼容。 起因 最近在看以前的代碼時(shí),發(fā)現(xiàn)年初在熟悉react hooks新特性時(shí)寫(xiě)下了這樣一段代碼: let i = 0; function Test(props) { c...
摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...
摘要:前兩天做了一份筆試題按照?qǐng)?zhí)行順序列出下面代碼的打印內(nèi)容可能有些小朋友會(huì)被里面那個(gè)立即執(zhí)行函數(shù)嚇傻。和將指向改變至,也就是了。 前兩天做了一份筆試題:按照?qǐng)?zhí)行順序列出下面代碼的打印內(nèi)容 var name = The Window; var object = { name : The Object, getNameFunc : function(){ (()...
摘要:直接開(kāi)始題目是厲害了說(shuō)句實(shí)話(huà)開(kāi)發(fā)中誰(shuí)寫(xiě)成這樣保證會(huì)被打死。不過(guò)面試就是面試,有面試官的考量點(diǎn)。官方是這么說(shuō)的。結(jié)果完美,不過(guò)小姐姐的意思是數(shù)組的方法會(huì)自動(dòng)觸發(fā)數(shù)組的。 直接開(kāi)始題目是 if(a==1 && a==2 && a==3){ alert(厲害了) } 說(shuō)句實(shí)話(huà)開(kāi)發(fā)中誰(shuí)寫(xiě)成這樣保證會(huì)被打死。 不過(guò)面試就是面試,有面試官的考量點(diǎn)。 我理解的點(diǎn)有兩個(gè) 1、隱式類(lèi)型轉(zhuǎn)換 先說(shuō)...
閱讀 2814·2021-11-16 11:44
閱讀 978·2021-10-09 09:58
閱讀 4503·2021-09-24 09:48
閱讀 4359·2021-09-23 11:56
閱讀 2415·2021-09-22 15:48
閱讀 1902·2021-09-07 10:07
閱讀 3213·2021-08-31 09:46
閱讀 514·2019-08-30 15:56