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