1. 程式人生 > >作用域鏈及其相關概念

作用域鏈及其相關概念

    //作用域鏈
    var title ="鏈條";
    function f1(){
        console.log("f1"+title);
        function f2(){
            console.log("f2"+title);
            function f3(){
                console.log("f3"+title);
            }
            f3();//f3鏈條
        }
        f2();//f2鏈條
    }
    f1();//f1鏈條

定義: 

變數在當前環境,內部環境,內部深層環境都其作用的現象形成了一個鏈條,這個鏈條就被稱為變數的“作用域鏈”

特點:外部環境變數,可以給內部環境使用

 

作用域鏈的作用

1.變數必須“先宣告,後使用”

函式可以“先使用,後宣告”,原因是函式有預載入過程,本質還是函式宣告在前,使用在後

    //變數必須"先宣告。後使用 "
    //同名的函式和變數的執行有順序問題

    var getInfo = "school";
    getInfo(); //itcast
    function getInfo(){
        console.log("itcast") //Uncaught TypeError: getInfo is not a function
    }

2.內部環境可以訪問外部環境的變數,反之不然

    var  age = 20;
    function f1(){
        var height =170;
        console.log(age); //內環境,訪問外環境 變數
    }
    f1();
    console.log(height);//外環境訪問內環境變數(不允許)

3.變數的作用域是宣告時決定的,而不是執行時

    var food = "milk";
    function f1(){
        console.log(food); //milk
    }
    
function f2(){ var food = "brand"; f1(); } f2();

函式是在全域性宣告的,而呼叫時在f2內部環境呼叫的,由此可以發現,變數的作用域是宣告的時候決定的,而不是在執行時

 

活動物件 AO Active Object

1,js程式碼執行是有環境的

2,該環境定義了其有權訪問的其他資料

3,環境有一個與之相關的活動物件AO

4,環境中所有的變數和函式都是活動物件的屬性

5,全域性環境是最外圍的執行環境,活動物件是window物件

6,執行環境中的程式碼執行完畢後會被銷燬

 

執行環境以及順序優先順序

 

 var height =175; //外部環境變數
    function f1() {
        var height = 165; //外部環境變數
        function f2(height) { //形參
            var height = 190;
            console.log(height);
            function height() { //本環境函式
                alert('skdjlks')
            }
        }

        f2(180);
    }
    f1();

 

 優先順序  內部環境變數》》本環境函式》》》形參》》》 外部環境變數

 

 全域性變數和區域性變數

 全域性變數:全域性變數 其是活動物件 window的成員資訊

  區域性變數:其在一定範圍內可以看做是"全域性變數",其在本環境,內部環境,內部深層環境都可以被訪問