作用域理解:定義的變數、函數生效的範圍。 javascript 有全域作用域和函數作用域兩種。
註:es6實作let 區塊級作用域不是js原生的,底層同樣是透過var實現的。如果想了解具體細節,請造訪babel官方 對es6中let 進行解析。
範圍:一段內或一個函數內;
全域:函數宣告、變數宣告 。範圍:;
函數:函數宣告、變數宣告、this、arguments。範圍:一個函數內部;
<script> foo(); //打印a var foo = 1; function foo (){ console.log(’a‘) }; console.log(foo); //1 </script> //实际的执行顺序为 <script> function foo(){ //函数声明优先于变量的声明 console.log("a"); } //var a ; 重复声明,这儿被省略了。 foo(); //打印a foo = 1; //给foo赋值为1 console.log(foo); //1 </script>
當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 為定義常數。註:定義的常數的值儲存的記憶體位址不可變動,值是可變的例如常數中定義的是數組 或者當物件時候,可以透過數組或物件方法操作原數據,只要不重新賦值就沒問題。
以上是javascript 作用域詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!