任何程序設計語言都有做用域的概念,簡單的說,做用域就是變量的做用範圍。
在JavaScript中,變量分爲全局變量和局部變量,與此相對應的,變量的做用域有全局做用域和局部做用域兩種。
在函數外聲明的變量爲全局變量,全局變量所對應的做用域爲全局做用域。看以下代碼:函數
var globalEle = "世界這麼大"; function func(){ console.log("函數內部:" + globalEle); } func(); console.log("函數外部:" + globalEle);
打印結果:spa
結果分析:設計
在函數外部聲明瞭一個變量globalEle,所以它爲全局變量,擁有全局做用域,全局變量不管在函數內部仍是函數外部均可以被訪問。3d
在函數內聲明的變量爲局部變量,局部變量所對應的做用域爲局部做用域。看以下代碼:code
function func(){ var localEle = "而我在國內" console.log("函數內部:" + localEle); } func(); console.log("函數外部:" + localEle);
打印結果:blog
結果分析:ip
在函數內部聲明瞭一個變量localEle,所以它爲局部變量,擁有局部做用域,局部變量只能在當前聲明的函數內起做用,所以在函數外訪問局部變量會提示not defined。作用域
做用域鏈的創建過程此處不詳細講,一些官網定義的抽象的概念也很少加以闡述,就經過下面的例子來看一下,看以下代碼: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。但願你能經過這個簡單的案例理解做用域鏈。
好啦,就說這麼多咯,以上說法有不嚴謹之處還請各位指正,祝工做愉快!