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