JS之函數作用域及作用域鏈


變量作用域

在JavaScript中全局變量的作用域比較簡單,它的作用域是全局的,在代碼的任何地方都是有定義的。然而函數的參數和局部變量只在函數體內有定義。另外局部變量的優先級要高於同名的全局變量,也就是說當局部變量與全局變量重名時,局部變量會覆蓋全局變量。

 var num = 1;            //聲明一個全局變量
    function func() {
        var num = 2;        //聲明一個局部變量
        return num;
    }
    console.log(func());    //輸出:2 
    console.log(num);      //輸出:1

注:聲明局部變量時一定要使用var,否則,解釋器會將該變量當做全局對象window的屬性。

函數作用域

在JavaScript中變量的作用域,並非和C、Java等編程語言似得,在變量聲明的代碼段之外是不可見的,我們通常稱為塊級作用域,然而在JavaScript中使用的是函數作用域(變量在聲明它們的函數體以及這個函數體嵌套的任意函數體都是有定義的)。

function func() {
        console.log(num);           //輸出:undefined,而非報錯,因為變量num在整個函數體內都是有定義的
        var num = 1;                //聲明num 在整個函數體func內都有定義
        console.log(num);           //輸出:1
    }
    func();

注:JavaScript的函數作用域是指在在函數內聲明的所有變量在函數體內始終是可見的,也就是說在函數體內變量聲明之前就已經可用了。

作為屬性的變量

當聲明一個全局變量的時候,實際上是定義了全局對象window的一個屬性。

    var num = 1;            //聲明全變量num
    alert(window.num)       //輸出:1 聲明的全局變量實際上就是聲明了一個window對象的屬性

javascript有兩種作用域:全局作用域;局部作用域/函數作用域;
顧名思義,全局變量在全局作用域,局部變量在局部作用域中。
全局變量網頁中所有腳本和函數均可使用。 如果變量在函數內部沒有用var聲明,則也是全局變量,但不推薦。

作用域鏈

作用域鏈是查找一個變量的時候,一層一層的向上形成的查找軌跡。

每個函數都有自己的執行環境,環境內存儲了作用域內定義的所有變量。當函數執行時,環境被推入環境棧中,執行完畢后,彈出環境,返回之前的執行環境。

作用域鏈的作用是保證對執行環境有權訪問的所有變量和函數的有序訪問,作用域的前端,始終是當前執行代碼所在環境的變量對象(也就是代碼里最近的那個)

function foo(a) {
    var b = a * 2;
    function bar(c) {
        console.log( a, b, c );
    }
    bar(b * 3);
}
foo( 2 ); // 2 4 12

標識符解析是沿着作用域鏈一級一級地搜索標識符地過程。搜索過程始終從作用域鏈地前端開始,然后逐級向后回溯,直到找到標識符為止(如果找不到標識符,通常會導致錯誤發生)—-《JavaScript高級程序設計》

參考:https://blog.csdn.net/qq_33939113/article/details/82717240
https://www.cnblogs.com/mrzl/p/4415149.html
https://cloud.tencent.com/developer/article/1339323


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM