国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

一道閉包題引發(fā)的思考

zombieda / 1799人閱讀

摘要:高級(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

相關(guān)文章

  • 一道閉包引發(fā)思考

    摘要:高級(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 ...

    Rindia 評(píng)論0 收藏0
  • 一個(gè)removeEventListener引發(fā)思考

    摘要:而為對(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...

    jeyhan 評(píng)論0 收藏0
  • 一道面試引發(fā)思考 --- Event Loop

    摘要:想必面試題刷的多的同學(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)題在我腦...

    betacat 評(píng)論0 收藏0
  • 一道筆試引發(fā)思考

    摘要:前兩天做了一份筆試題按照?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(){ (()...

    soasme 評(píng)論0 收藏0
  • 一道前端面試引發(fā)思考

    摘要:直接開(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ō)...

    gaomysion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<