摘要:閉包,一言以蔽之,就是函數(shù)和作用域鏈,通俗點(diǎn)就是函數(shù)內(nèi)部使用了外面定義的變量。內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境的任何變量或函數(shù)。
閉包,一言以蔽之,就是函數(shù)和作用域鏈,通俗點(diǎn)就是函數(shù)內(nèi)部使用了外面定義的變量。
我們從一個(gè)例子說起:
function foo(){ var a = 2; var b = 3; return function bar(){ console.log(a+b); } } var baz = foo(); baz();
最后的結(jié)果,控制臺(tái)會(huì)輸出a+b的值,也就是5。
在這段代碼里,出現(xiàn)了閉包,bar()就是函數(shù),bar引用了外面定義的變量a和b。
那么作用域鏈又是什么呢?
來個(gè)官方解釋:(紅寶書)
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈。它的作用是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。它的前端始終都是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對(duì)象。
這些東西看起來好像很難理解。我們先從執(zhí)行環(huán)境這個(gè)概念開始解釋。
執(zhí)行環(huán)境(有時(shí)也稱作環(huán)境)定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。
比如說上面的例子中,共有三個(gè)執(zhí)行環(huán)境:
全局環(huán)境,有一個(gè)函數(shù)foo和一個(gè)變量baz。
foo的局部環(huán)境,有兩個(gè)變量a和b和一個(gè)函數(shù)bar。
bar的局部環(huán)境。
bar的局部環(huán)境中,沒有變量,但是它可以訪問foo的局部環(huán)境中的變量a和b。
但是在全局環(huán)境中不能直接訪問foo的局部環(huán)境中的變量a和b。因?yàn)槿汁h(huán)境是foo局部環(huán)境的父執(zhí)行環(huán)境。
最后我們?cè)賮砜醋饔糜蜴?br>下圖可以形象地表示上面例子的作用域鏈
圖中的矩形表示特定的執(zhí)行環(huán)境。內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境的任何變量或函數(shù)。這些環(huán)境之間是有次序的。每個(gè)環(huán)境可以向外搜索,但反之不行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93563.html
摘要:而閉包卻能阻止這件事情發(fā)生。由于的聲明位置使它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存在,以供在之后進(jìn)行引用。到這里,小菊花課堂之閉包的內(nèi)容就告一段落啦,感謝各位能耐心看到這里。 由于前段時(shí)間項(xiàng)目沒有那么忙,然后我這人一天不看點(diǎn)啥就非常焦慮,于是二刷《你不知道的JavaScript》,現(xiàn)在讀到閉包,想著看完這一章節(jié),寫點(diǎn)東西也是挺好的,所以有了下面的內(nèi)容,如有不對(duì)的地方,敬請(qǐng)斧...
摘要:閉包里面保存的變量只有被方法引用了的變量這個(gè)例子里,閉包里只有并沒有。那最后來說說的問題閉包到底是什么閉包是一個(gè)作用域。鑒于在的調(diào)試窗口,是放在下面的那閉包這個(gè)作用域是個(gè)什么范圍被后代方法子方法,孫子方法。。。 首先給js的作用域這個(gè)話題打標(biāo)簽:2,var, 全局變量,局部變量,函數(shù),undefined, 作用域提升,賦值不會(huì)提升,ReferenceError, 同名覆蓋。打完標(biāo)簽之后...
摘要:依然持有對(duì)該作用域的引用,而這個(gè)引用就叫作閉包。無(wú)論通過何種手段將內(nèi)部函數(shù)傳遞到所在的詞法作用域以外,它都會(huì)持有對(duì)原始定義作用域的引用,無(wú)論在何處執(zhí)行這個(gè)函數(shù)都會(huì)使用閉包。 因?yàn)樽罱?xiàng)目比較少,閑來覺得需要學(xué)習(xí)《你不知道的JavaScript》;跟大家分享一下; 什么是作用域 需要一套設(shè)計(jì)良好的規(guī)則來存儲(chǔ)變量,并且之后可以方便地找到這些變量。這套規(guī)則被稱為作用域 執(zhí)行 var a = ...
摘要:之前一篇文章我們?cè)敿?xì)說明了變量對(duì)象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創(chuàng)建的函數(shù),其作用域指向全局作用域。所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。 作用域 定義 在編程語(yǔ)言中,作用域控制著變量與參數(shù)的可見性及生命周期,它能減少名稱沖突,而且提供了自動(dòng)內(nèi)存管理 --javascript 語(yǔ)言精粹 我理解的是,一個(gè)變量、函數(shù)或者成員可以在代碼中訪問到的范圍。 js的變量作...
閱讀 3159·2021-11-22 09:34
閱讀 657·2021-11-22 09:34
閱讀 2516·2021-10-08 10:18
閱讀 3445·2021-09-22 15:57
閱讀 2698·2021-09-22 15:25
閱讀 2504·2019-08-30 15:54
閱讀 2255·2019-08-30 15:44
閱讀 1854·2019-08-29 11:18