深刻淺出:JavaScript做用域鏈

  1. 什麼是做用域

任何程序設計語言都有做用域的概念,簡單的說,做用域就是變量的做用範圍。

  2. 變量的分類和變量做用域的分類

在JavaScript中,變量分爲全局變量和局部變量,與此相對應的,變量的做用域有全局做用域和局部做用域兩種。

  3. 全局變量和全局做用域

  在函數外聲明的變量爲全局變量,全局變量所對應的做用域爲全局做用域。看以下代碼:函數

var globalEle = "世界這麼大";
function func(){
    console.log("函數內部:" + globalEle);
}
func();
console.log("函數外部:" + globalEle);

  打印結果:spa

  結果分析:設計

  在函數外部聲明瞭一個變量globalEle,所以它爲全局變量,擁有全局做用域,全局變量不管在函數內部仍是函數外部均可以被訪問。3d

  4. 局部變量和局部做用域

  在函數內聲明的變量爲局部變量,局部變量所對應的做用域爲局部做用域。看以下代碼:code

function func(){
    var localEle = "而我在國內"
    console.log("函數內部:" + localEle);
}
func();
console.log("函數外部:" + localEle);

  打印結果:blog

  結果分析:ip

  在函數內部聲明瞭一個變量localEle,所以它爲局部變量,擁有局部做用域,局部變量只能在當前聲明的函數內起做用,所以在函數外訪問局部變量會提示not defined。作用域

  5. 什麼是做用域鏈

  做用域鏈的創建過程此處不詳細講,一些官網定義的抽象的概念也很少加以闡述,就經過下面的例子來看一下,看以下代碼:io

var ele = "函數外面定義的變量";
function func(){
    var ele = "函數func內定義的變量";
    function son(){
        var ele = "函數son內定義的變量";
        console.log(ele);
    }
    son();
}
func();

  打印結果:console

  結果分析:變量ele被定義了三次,但他們的做用域不一樣,第一次定義的ele是全局變量,擁有全局做用域。第二次定義的ele是局部變量,在函數func內起做用,由於函數son是函數func的子函數,因此在函數son內也能夠訪問到這裏定義的變量。第三次定義的ele也是局部變量,在函數son內部起做用。因此,在函數son內部訪問變量ele也就是打印變量ele的時候,會依照就近原則先去訪問函數son內部的定義的變量ele,若是找不到會一層層網上找,直到最上面一層,若是依舊找不到會提示not defined。但願你能經過這個簡單的案例理解做用域鏈。

  好啦,就說這麼多咯,以上說法有不嚴謹之處還請各位指正,祝工做愉快!

相關文章
相關標籤/搜索