溫馨提示×

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

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

如何理解JS中作用域及作用域鏈

發(fā)布時(shí)間:2021-06-16 09:18:27 來(lái)源:億速云 閱讀:173 作者:chen 欄目:web開(kāi)發(fā)

這篇文章主要介紹“如何理解JS中作用域及作用域鏈”,在日常操作中,相信很多人在如何理解JS中作用域及作用域鏈問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何理解JS中作用域及作用域鏈”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

12.1 作用域

如何理解JS中作用域及作用域鏈

12.1.1 定義

作用域是指在程序中定義變量的區(qū)域,該位置決定了變量的生命周期。簡(jiǎn)言之作用域就是變量與函數(shù)的可訪問(wèn)范圍,即作用域控制著變量和函數(shù)的可見(jiàn)性和生命周期。

12.1.2 分類

在ES6階段之前,作用域分為兩種:全局作用域和函數(shù)作用域;進(jìn)行ES6之后,作用域分為:全局作用域、函數(shù)作用域和塊級(jí)作用域。

全局作用域

在該作用域中的對(duì)象在代碼的任何地方都能訪問(wèn),其生命周期伴隨著頁(yè)面的生命周期。例如以下內(nèi)容均在全局作用域中。

(1)window上的屬性(在瀏覽器中)

console.log(window.location.href); // 頁(yè)面地址

(2)最外層的函數(shù)

function testFun() {     console.log('testFun'); }  testFun();

(3)最外層定義的變量

let val1 = 10; const val2 = 20; var val3 = 30;

(4)未定義直接賦值的變量

val4 = 40;

(5)js規(guī)定的全局對(duì)象的屬性,三個(gè)值(Infinity、NaN、undefined)、九個(gè)函數(shù)(parseInt、parseFloat、decodeURI、encodeURI……)、一些構(gòu)造器(Date、Array等)、四個(gè)用于當(dāng)做命名空間的對(duì)象(Atomics、JSON、Math、Reflect)。

Math.sin(Math.PI / 2);; const date = new Date();

函數(shù)作用域

在函數(shù)內(nèi)部定義的變量或者函數(shù),并且定義的變量或者函數(shù)只能在函數(shù)內(nèi)部被訪問(wèn)。在函數(shù)執(zhí)行結(jié)束之后,函數(shù)內(nèi)部定義的變量會(huì)被銷毀。

function test() {     var val1 = 10;     function fun1() {         console.log('fun1');     }     console.log(val1); // 10     fun1(); // fun1 } test(); // console.log(val1); // val1 is not defined // fun1(); // fun1 is not defined

塊級(jí)作用域

在ES6階段,出現(xiàn)了塊的概念,新增了塊級(jí)作用域,同時(shí)新增了let、const命令。塊級(jí)作用域簡(jiǎn)言之就是使用一對(duì)大括號(hào){}包裹的一段代碼,通過(guò)單獨(dú)的大括號(hào)、if塊、while塊、for塊、try/catch/finallyd等都會(huì)產(chǎn)生塊級(jí)作用域。(對(duì)于let和const在塊級(jí)作用域的特征可見(jiàn)前端百題斬【002】)

// 單一括號(hào)包括的塊 {}  // if語(yǔ)句 if (flag) {  }  // for語(yǔ)句 for (let i = 0; i < 10; i++) {  }  // &hellip;&hellip;

12.2 作用域鏈

如何理解JS中作用域及作用域鏈

12.2.1 定義

在每個(gè)執(zhí)行上下文的變量環(huán)境中,都包含一個(gè)外部引用(成為outer),用來(lái)指向外部的指向上下文。當(dāng)在查找一個(gè)變量的時(shí)候,如果在當(dāng)前的變量環(huán)境中沒(méi)有找到,js引擎會(huì)繼續(xù)在outer所指向的執(zhí)行上下文中查找,把這個(gè)查找的鏈條稱為作用域鏈。(作用域鏈可以理解為一組對(duì)象列表,包含  父級(jí)和自身的變量對(duì)象,因此我們便能通過(guò)作用域鏈訪問(wèn)到父級(jí)里聲明的變量或者函數(shù)。)

12.2.2 組成

作用域鏈由兩部分組成,分別是[[scope]]屬性和AO。

[[scope]]屬性:指向父級(jí)變量對(duì)象和作用域鏈,也就是包含了父級(jí)的[[scope]]和AO

AO:自身活動(dòng)對(duì)象,也就是該執(zhí)行上下文中的變量對(duì)象。

擴(kuò)展:如此 [[scope]]包含[[scope]],便自上而下形成一條 鏈?zhǔn)阶饔糜颉?/p>

12.2.3 查找規(guī)則

  • 從當(dāng)前的執(zhí)行作用域開(kāi)始查找變量;

  • 如果在當(dāng)前作用域中找不到該變量,則向上一級(jí)進(jìn)行查找;

  • 繼續(xù)向上一層查找,直到最外層的全局作用域。

12.2.4 實(shí)戰(zhàn)

下面用一個(gè)簡(jiǎn)單的例子來(lái)演示該作用域鏈,以進(jìn)一步理解作用域鏈。

var val1 = 10; function fun1() {     var val2 = 20;     function fun2() {         var val3 = 30;         console.log(val1 + val2 + val3);     }     fun2(); }  fun1();

如何理解JS中作用域及作用域鏈

結(jié)合代碼和上述執(zhí)行上下文的流程圖,當(dāng)執(zhí)行到console.log(val1 + val2 +  val3);時(shí)會(huì)在fun2函數(shù)作用域中找到val3變量,在fun1函數(shù)作用域中找到變量val2,在全局作用域中找到變量val1,最終與該語(yǔ)句相關(guān)的三個(gè)變量均獲取到。其中fun2函數(shù)作用域、fun1函數(shù)作用域、全局作用域就構(gòu)成了一條作用域鏈。

到此,關(guān)于“如何理解JS中作用域及作用域鏈”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

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

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

js
AI