日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
前端百題斬——JS中作用域及作用域鏈的真面目

12.1 作用域

12.1.1 定義

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名注冊、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、獨山網(wǎng)站維護、網(wǎng)站推廣。

12.1.2 分類

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

全局作用域

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

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

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

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

 
 
 
 
  1. function testFun() {
  2.     console.log('testFun');
  3. }
  4. testFun();

(3)最外層定義的變量

 
 
 
 
  1. let val1 = 10;
  2. const val2 = 20;
  3. var val3 = 30;

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

 
 
 
 
  1. val4 = 40;

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

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

函數(shù)作用域

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

 
 
 
 
  1. function test() {
  2.     var val1 = 10;
  3.     function fun1() {
  4.         console.log('fun1');
  5.     }
  6.     console.log(val1); // 10
  7.     fun1(); // fun1
  8. }
  9. test();
  10. // console.log(val1); // val1 is not defined
  11. // fun1(); // fun1 is not defined

塊級作用域

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

 
 
 
 
  1. // 單一括號包括的塊
  2. {}
  3. // if語句
  4. if (flag) {
  5. }
  6. // for語句
  7. for (let i = 0; i < 10; i++) {
  8. }
  9. // ……

12.2 作用域鏈

12.2.1 定義

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

12.2.2 組成

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

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

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

擴展:如此 [[scope]]包含[[scope]],便自上而下形成一條 鏈式作用域。

12.2.3 查找規(guī)則

  • 從當前的執(zhí)行作用域開始查找變量;
  • 如果在當前作用域中找不到該變量,則向上一級進行查找;
  • 繼續(xù)向上一層查找,直到最外層的全局作用域。

12.2.4 實戰(zhàn)

下面用一個簡單的例子來演示該作用域鏈,以進一步理解作用域鏈。

 
 
 
 
  1. var val1 = 10;
  2. function fun1() {
  3.     var val2 = 20;
  4.     function fun2() {
  5.         var val3 = 30;
  6.         console.log(val1 + val2 + val3);
  7.     }
  8.     fun2();
  9. }
  10. fun1();

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

本文轉(zhuǎn)載自微信公眾號「執(zhí)鳶者」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系執(zhí)鳶者公眾號。


本文題目:前端百題斬——JS中作用域及作用域鏈的真面目
URL網(wǎng)址:http://www.5511xx.com/article/cdsphdh.html