溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是作用域與作用域鏈

發(fā)布時(shí)間:2021-10-15 14:58:35 來源:億速云 閱讀:156 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“什么是作用域與作用域鏈”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“什么是作用域與作用域鏈”吧!

作用域

如果說執(zhí)行上下文是代碼的執(zhí)行環(huán)境,那么作用域就是執(zhí)行環(huán)境中的一套執(zhí)行規(guī)則,既然是規(guī)則,JavaScript  引擎執(zhí)行代碼時(shí)要遵守這套規(guī)則,同時(shí)開發(fā)人員在寫代碼時(shí),同樣也要遵守這套規(guī)則。

1. 什么是作用域

我們先來看這樣一個(gè)例子:

function foo () {   var bar = 'xiaolu' } foo() console.log(bar)

上述的運(yùn)行結(jié)果很明顯,控制臺(tái)會(huì)報(bào)錯(cuò) bar is not  defined,我們可以通過這個(gè)小例子就可以發(fā)現(xiàn)在函數(shù)外部訪問函數(shù)內(nèi)部聲明的變量是不可訪問的,這背后的原因就是 JavaScript  作用域存在導(dǎo)致的結(jié)果。

2. 什么是詞法環(huán)境

說到作用域,那什么是作用域?我們先來認(rèn)識(shí)一下這位老朋友詞法環(huán)境。

ECMAScript 規(guī)范中對(duì)詞法環(huán)境的描述如下:詞法環(huán)境是用來定義基于詞法嵌套結(jié)構(gòu)的 ECMAScript  代碼內(nèi)的標(biāo)識(shí)符與變量值和函數(shù)值之間的關(guān)聯(lián)關(guān)系的一種規(guī)范類型。

說的直白一點(diǎn),詞法環(huán)境就是一套規(guī)范和規(guī)則,它用來規(guī)定某些函數(shù)和變量的可訪問范圍等,我們也稱詞法環(huán)境為「詞法作用域」。

既然詞法作用域是一套約定好的規(guī)則,那么詞法作用域的作用范圍是開發(fā)人員在寫代碼的時(shí)候就已經(jīng)是確定了的。

當(dāng)代碼執(zhí)行的時(shí)候, JavaScript 引擎就會(huì)根據(jù)這套規(guī)范通過標(biāo)識(shí)符名稱來查找相對(duì)應(yīng)的變量和函數(shù)。

好吧,最后給它做個(gè)總結(jié)性的定義。

作用域:作用域是一套約定好的規(guī)范和規(guī)則,它用來規(guī)定某些函數(shù)和變量的可訪問性等。

2. 作用域鏈

作用域我們弄明白了,我們再來看作用域鏈。作用域鏈和作用域卻大不相同,咱們分別從「執(zhí)行棧層面」和「代碼層面」來體驗(yàn)一下什么是作用域鏈。

var name = "xiaolu"; function fn () {   console.log(name);   function getName(){     console.log(name);   }   getName(); } fn();

執(zhí)行棧中的作用域鏈?zhǔn)疽鈭D:

什么是作用域與作用域鏈

該示意圖為上述代碼的執(zhí)行情況,在上述示意圖中,不同的色塊縮進(jìn)形成的可訪問鏈就是我們所說的作用域鏈。

雖然上述示意圖是抽象出來的,如果我們在代碼層面來理解作用域鏈,又是如何實(shí)現(xiàn)的呢?

在上一篇中分享到,每當(dāng)創(chuàng)建一個(gè)新的執(zhí)行上下文時(shí),都會(huì)創(chuàng)建一個(gè)「變量對(duì)象」用于存放當(dāng)前執(zhí)行上下文中的變量和函數(shù)。(記?。哼@個(gè)變量對(duì)象很重要)

如果我們把這些執(zhí)行上下文的「變量對(duì)象」關(guān)聯(lián)起來,就形成了一條鏈,我們把這條鏈的實(shí)現(xiàn)稱為「作用域鏈」。

什么是作用域與作用域鏈

上述代碼的執(zhí)行結(jié)果是打印輸出:

var name = "xiaolu"; function fn () {   console.log(name);   function getName(){     console.log(name);   }   getName(); } fn();

當(dāng)內(nèi)部的 getName 執(zhí)行時(shí) JavaScript 引擎就在 getName 作用域內(nèi)查找變量  name,發(fā)現(xiàn)并沒有,就會(huì)沿著上圖中的作用域鏈往上層尋找,在 fn 的作用域中也沒有發(fā)現(xiàn) name  變量,然后繼續(xù)沿著作用域鏈往上層的尋找,直到全局作用域中,發(fā)現(xiàn)存在變量 name,然后輸出 name 的值。

到此,相信大家對(duì)“什么是作用域與作用域鏈”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI