摘要:閉包,一言以蔽之,就是函數(shù)和作用域鏈,通俗點就是函數(shù)內(nèi)部使用了外面定義的變量。內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境的任何變量或函數(shù)。
閉包,一言以蔽之,就是函數(shù)和作用域鏈,通俗點就是函數(shù)內(nèi)部使用了外面定義的變量。
我們從一個例子說起:
function foo(){ var a = 2; var b = 3; return function bar(){ console.log(a+b); } } var baz = foo(); baz();
最后的結(jié)果,控制臺會輸出a+b的值,也就是5。
在這段代碼里,出現(xiàn)了閉包,bar()就是函數(shù),bar引用了外面定義的變量a和b。
那么作用域鏈又是什么呢?
來個官方解釋:(紅寶書)
當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。它的作用是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。它的前端始終都是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對象。
這些東西看起來好像很難理解。我們先從執(zhí)行環(huán)境這個概念開始解釋。
執(zhí)行環(huán)境(有時也稱作環(huán)境)定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。
比如說上面的例子中,共有三個執(zhí)行環(huán)境:
全局環(huán)境,有一個函數(shù)foo和一個變量baz。
foo的局部環(huán)境,有兩個變量a和b和一個函數(shù)bar。
bar的局部環(huán)境。
bar的局部環(huán)境中,沒有變量,但是它可以訪問foo的局部環(huán)境中的變量a和b。
但是在全局環(huán)境中不能直接訪問foo的局部環(huán)境中的變量a和b。因為全局環(huán)境是foo局部環(huán)境的父執(zhí)行環(huán)境。
最后我們再來看作用域鏈
下圖可以形象地表示上面例子的作用域鏈
圖中的矩形表示特定的執(zhí)行環(huán)境。內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境的任何變量或函數(shù)。這些環(huán)境之間是有次序的。每個環(huán)境可以向外搜索,但反之不行。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93563.html
摘要:而閉包卻能阻止這件事情發(fā)生。由于的聲明位置使它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存在,以供在之后進(jìn)行引用。到這里,小菊花課堂之閉包的內(nèi)容就告一段落啦,感謝各位能耐心看到這里。 由于前段時間項目沒有那么忙,然后我這人一天不看點啥就非常焦慮,于是二刷《你不知道的JavaScript》,現(xiàn)在讀到閉包,想著看完這一章節(jié),寫點東西也是挺好的,所以有了下面的內(nèi)容,如有不對的地方,敬請斧...
摘要:閉包里面保存的變量只有被方法引用了的變量這個例子里,閉包里只有并沒有。那最后來說說的問題閉包到底是什么閉包是一個作用域。鑒于在的調(diào)試窗口,是放在下面的那閉包這個作用域是個什么范圍被后代方法子方法,孫子方法。。。 首先給js的作用域這個話題打標(biāo)簽:2,var, 全局變量,局部變量,函數(shù),undefined, 作用域提升,賦值不會提升,ReferenceError, 同名覆蓋。打完標(biāo)簽之后...
摘要:之前一篇文章我們詳細(xì)說明了變量對象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執(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ù)的可見性及生命周期,它能減少名稱沖突,而且提供了自動內(nèi)存管理 --javascript 語言精粹 我理解的是,一個變量、函數(shù)或者成員可以在代碼中訪問到的范圍。 js的變量作...
閱讀 3101·2021-11-22 09:34
閱讀 605·2021-11-22 09:34
閱讀 2455·2021-10-08 10:18
閱讀 3387·2021-09-22 15:57
閱讀 2600·2021-09-22 15:25
閱讀 2415·2019-08-30 15:54
閱讀 2128·2019-08-30 15:44
閱讀 1806·2019-08-29 11:18