在此作用域中尚未宣告_javascript 作用域詳解
技術標籤:在此作用域中尚未宣告
作用域理解:定義的變數、函式生效的範圍。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 為定義常量。注:定義的常量的值儲存的記憶體地址不可變動,值是可變的比如常量中定義的是陣列 或者物件時候,可以通過陣列或物件方法操作原資料,只要不重新賦值就沒問題。