成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端百題斬——JS中作用域及作用域鏈的真面目

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

[[403125]]

12.1 作用域

12.1.1 定義

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

12.1.2 分類

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

全局作用域

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

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

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

(2)最外層的函數

  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)、九個函數(parseInt、parseFloat、decodeURI、encodeURI……)、一些構造器(Date、Array等)、四個用于當做命名空間的對象(Atomics、JSON、Math、Reflect)。

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

函數作用域

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

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

塊級作用域

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

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

12.2 作用域鏈

12.2.1 定義

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

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(); 

 

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

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

 

責任編輯:武曉燕 來源: 執(zhí)鳶者
相關推薦

2021-03-09 08:35:51

JSS作用域前端

2011-09-06 09:56:24

JavaScript

2019-03-13 08:00:00

JavaScript作用域前端

2011-05-12 18:26:08

Javascript作用域

2021-03-17 08:39:24

作用域作用域鏈JavaScript

2021-03-16 22:25:06

作用域鏈作用域JavaScript

2015-08-18 13:42:42

js作用域鏈變量

2021-07-05 07:02:33

前端跨域策略

2020-11-19 07:49:24

JS變量作用域

2011-03-18 09:27:00

Spring

2016-12-19 11:10:32

JavaScript變量作用域

2010-09-29 15:02:23

DHCP作用域

2010-09-25 16:10:09

添加DHCP作用域

2021-05-19 07:02:42

JS對象方法

2021-05-12 07:04:55

Js變量方式

2021-06-07 07:01:43

js關鍵字運行

2023-09-05 08:23:56

SpringScope方法

2020-08-11 08:13:46

微服務

2020-08-12 07:48:11

鏈表單向鏈結點

2021-03-09 08:50:58

JavaScript前端作用域
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线一区二区三区 | 久久机热 | 欧美久久一区二区三区 | 国产小视频在线观看 | 特黄一级 | 在线精品一区二区三区 | 日韩av电影院 | 欧美性区 | 欧美国产精品一区二区三区 | 天天干天天爽 | 射久久| 99久久精品视频免费 | 91久久久久久久久久久久久 | 久久久久久综合 | 一级黄色片在线免费观看 | 91大片| 狠狠干av | www.久久久| www.蜜桃av.com | 欧美精品一区二区三区在线播放 | 天天操伊人 | 国产91av视频| 99免费看| 羞羞网站免费 | 久久久久亚洲 | 国产精品久久久久免费 | 一级免费毛片 | 久久曰视频 | 亚洲精品久久久久久久久久吃药 | 鲁一鲁资源影视 | 精品亚洲一区二区三区 | 欧美理论片在线观看 | 国产一区二区免费 | av日韩高清 | 国产黄色小视频 | 国产精品2区 | 天天综合干 | 亚洲人在线 | wwww.xxxx免费 | 欧美福利一区 | 五月婷婷丁香婷婷 |