首頁 >web前端 >js教程 >javascript 作用域詳解

javascript 作用域詳解

藏色散人
藏色散人轉載
2019-05-07 09:15:222565瀏覽

作用域理解:定義的變數、函數生效的範圍。 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中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除