1. 程式人生 > 其它 >在此作用域中尚未宣告_javascript 作用域詳解

在此作用域中尚未宣告_javascript 作用域詳解

技術標籤:在此作用域中尚未宣告

32605d74c224b8dc038c3ae510057eba.png

作用域理解:定義的變數、函式生效的範圍。javascript 有全域性作用域和函式作用域兩種。注:es6實現let 塊級作用域不是js原生的,底層同樣是通過var實現的。如果想了解具體細節,請訪問babel官方 對es6中let 進行解析。

執行上下文

範圍:一段內或者一個函式內;

全域性:函式宣告、變數宣告 。範圍:;

函式:函式宣告、變數宣告、this、arguments。範圍:一個函式內部;

函式、變數宣告提升

//實際的執行順序為

當js引擎執行一個 執行上下文程式碼塊時,執行順序為:

1.函式宣告 function a(){};(函式優先) 注:let a = function (){}; 這是變數的宣告和賦值,不是函式的宣告。

2.變數宣告 var a; 注:剛開始只對變數進行宣告,沒有進行賦值,如果 在賦值之前使用到這個變數 值為:undefined。

3.執行上下文為函式作用域時:確定this和arguments。

4.按照js單執行緒和非同步策略依次執行 作用域中的程式碼。

我們習慣將 var a = 2; 看作一個宣告,而實際上 JavaScript 引擎並不這麼認為。它將 var a和 a = 2 當作兩個單獨的宣告,第一個是編譯階段的任務,而第二個則是執行階段的任務。這意味著無論作用域中的宣告出現在什麼地方,都將在程式碼本身被執行前首先進行處理。可以將這個過程形象地想象成所有的宣告(變數和函式)都會被“移動”到各自作用域的最頂端,這個過程被稱為提升。要注意避免重複宣告,特別是當普通的 var 宣告和函式宣告混合在一起的時候,否則會引起很多危險的問題!

作用域鏈

自由變數:當前作用域沒有定義的變數,但是上層作用域定義了,可以在此層作用域中使用的變數。

作用域鏈:當使用一個變數時候,先在自己的作用域裡找,如果沒有找到,再到父級作用域找,一直找到全域性作用域,如果都沒有找到即報錯。

塊級作用域

js無塊級作用域,僅有全域性作用域和函式作用域兩種作用域。

ES6 通過對全域性作用域的特殊實現,實現了js的塊級作用域 let;

let 的生效範圍為 { };

const 為定義常量。注:定義的常量的值儲存的記憶體地址不可變動,值是可變的比如常量中定義的是陣列 或者物件時候,可以通過陣列或物件方法操作原資料,只要不重新賦值就沒問題。