javascript 作用域詳解

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

執行上下文
範圍:一段內或者一個函數內;
全局:函數聲明、變量聲明 。範圍:;
函數:函數聲明、變量聲明、this、arguments。範圍:一個函數內部;

函數、變量聲明提升

    foo(); //打印a
    var foo = 1;
    function foo (){
        console.log(’a‘)
    };
    console.log(foo); //1

//實際的執行順序爲

    function foo(){  //函數聲明優先於變量的聲明
        console.log("a");
    }
    //var a ;  重複聲明,這兒被省略了。
    foo(); //打印a
    foo = 1;  //給foo賦值爲1
    console.log(foo); //1


當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 爲定義常量。注:定義的常量的值存儲的內存地址不可變動,值是可變的比如常量中定義的是數組 或者對象時候,可以通過數組或對象方法操作原數據,只要不重新賦值就沒問題。
原文地址https://www.cnblogs.com/honkerzh/p/10566804.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章