JS的作用域
作用域是用來宣告,訪問和修改變數的上下文,定義了變數的訪問許可權和查詢機制。 |
作用域分類:
- 全域性作用域 (整個JS執行環境,最頂層作用域,其宣告的函式、變數等都是全域性的)
- 函式作用域 (函式執行時會建立作用域)
- 塊級作用域 ({ }大括號在 let、const關鍵字特性產生的作用域)
JS屬於編譯語言,逐行執行;編譯的過程分為三部分:
- 分詞/詞法分析。
- 解析/把詞法分析轉換成AST(抽象語法樹)。
- 程式碼生成/把AST轉成可執行程式碼。
示例:
var a = 1;
編譯過程:
- 分成var a、a=1;兩部分進行分析。
- 檢視當前作用域是否有a,如果有就忽略,如果沒有就建立變數a。
- (var、function宣告的變數會在當前作用域下進行變數提升)
- 賦值操作,首先檢視當前作用域下是否有變數a,要是不存在變數a就會報錯,要是存在進行賦值;其次如果是作用域巢狀的情況,當前作用域下不存在變數a,就會向外層作用域查詢,直到全域性作用域,如果不存在變數a就會報錯。
執行過程:
- 執行var a語句進行查詢a變數,這個過程叫做LHS(左側為查詢目標)。
- 執行a = 1賦值操作,過程叫做RHS(右側為目標查詢的目的)。
- 進行RHS必然會進行LHS。
注意:取值和賦值都是RHS,變數宣告和形參是LHS;RHS和LHS發生在執行過程中。
示例:
function foo(a) { var b = a; return a + b } var c = foo(2)
3處LHS查詢:
- var c 宣告
- var b 宣告
- 形參 a 宣告
4處RHS查詢:
- foo(2) 取值foo並執行
- var b = a語句,取值a
- a + b語句,取值a
- a + b語句,取值b
用var宣告的變數會進行變數提升,提升到當前作用域的最頂部,其值是undefined,因此在變數前進行取值不會報錯。
非嚴格模式下對沒有用var關鍵字宣告的變數語句之前進行RHS,報ReferenceError異常。如果是之後進行RHS,會先進行LHS,如果當前作用域還是全域性作用域下都沒有找到,會自動建立一個全域性變數並返回,嚴格模式下LHR查詢失敗時,並不會建立一個全域性變數並返回,報ReferenceError異常。
變數的訪問許可權問題:
塊級作用域裡的變數外層作用域是無法訪問,變數是指由let,const。
函式的形參和變數,內部函式是外層作用域無法訪問,屬於區域性變數。變數是指由let,const,var,function宣告的。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2712394/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- js的作用域、作用域鏈JS
- js的作用域與作用域鏈JS
- js的作用域和作用域鏈JS
- js作用域JS
- JS-作用域JS
- js 的詞法作用域和 thisJS
- JS變數作用域JS變數
- 對js中執行環境、作用域和作用域鏈的理解JS
- JS進擊之路:作用域JS
- JS-作用域題目JS
- JS作用域與閉包JS
- JS閉包作用域解析JS
- js基礎梳理-如何理解作用域和作用域鏈?JS
- 深入學習js之——詞法作用域和動態作用域JS
- 深入學習js之——詞法作用域和動態作用域#2JS
- web前端學習教程:JS的作用域鏈Web前端JS
- js的哪些操作可以改變作用域鏈?JS
- 【JS基礎】作用域和閉包JS
- 淺談JS作用域、this及閉包JS
- 原型模式故事鏈(5)--JS變數作用域、作用域鏈、閉包原型模式JS變數
- 深入學習js之——作用域鏈#5JS
- JS 總結之函式、作用域鏈JS函式
- 作用域及作用域鏈
- 作用域與作用域鏈
- 「譯」一個案例搞懂 Vue.js 的作用域插槽Vue.js
- 從JS的執行機制的角度談談作用域JS
- JavaScript 作用域 與 作用域鏈JavaScript
- JS 事件迴圈,閉包,作用域鏈題JS事件
- js作用域(變數提升,預解析)例題JS變數
- 你不懂的JS學習筆記(作用域和閉包)JS筆記
- js中,函式的閉包、作用域跟[[Scopes]]的關係JS函式
- javascript之作用域與作用域鏈JavaScript
- JS 底蘊之 變數、作用域和垃圾回收JS變數
- JS基礎總結(3)——作用域和閉包JS
- JS學習系列 01 - 編譯原理和作用域JS編譯原理
- 理解 JS 作用域鏈與執行上下文JS
- 作用域
- 作用域、作用域鏈及閉包(一)