做用域是JavaScript最重要的概念之一,想要學好JavaScript就須要理解JavaScript做用域和做用域的工做原理。今天這篇文章對JavaScript做用域和做用域鏈簡單的介紹,但願能幫助你們更好的學習JavaScript。javascript
JavaScript做用域html
任何程序設計語言都有做用域的概念,簡單的說,做用域就是變量與函數的可訪問範圍,即做用域控制着變量與函數的可見性和生命週期。在JavaScript中,變量的做用域有全局做用域和局部做用域兩種。java
1.全局做用域(Global Scope)ide
在代碼中任何地方都能訪問到的對象擁有全局做用域,通常來講如下幾種情形擁有全局做用域:函數
(1)最外層函數和最外層函數外面定義的變量擁有全局做用域,例如:學習
var authorName="別散客人"; function doSomething () { var blogName="Alidece"; function innerSay () { alert(blogName); } innerSay(); } alert(authorName);//別散客人 alert(blogName);//錯誤 doSomething();//Alidece innerSay();//出錯
(2)全部未定義直接賦值的變量自動聲明爲擁有全局全局做用域,例如:spa
function doSomething () { var authorName ="Alidece"; blogName = "Alidece"; alert(authorName); } doSomething(); alert(blogName); alert(authorName);//authorName is not defined
(3)全部window對象的屬性擁有全局做用域設計
通常狀況下,window對象的內置屬性都擁有全局做用域,例如window.name、window.location、window.top等等。code
1.局部做用域(local Scope)htm
和全局做用域相反,局部做用域通常只在固定的代碼片斷內能夠訪問到,最多見的例如函數內部,全部在一些地方也會看到有人把這種做用域稱爲函數做用域,例以下列代碼中的blogName和函數innerSay都只擁有局部做用域。
function doSomething () { var blogName="Alidece"; function innerSay () { alert(blogName); } innerSay(); }
做用域鏈(Scope chain)
在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象同樣,擁有能夠經過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],有ECMA-262標準第三版定義,該內部屬性包含了函數被建立的做用域中對象和集合,這個集合被稱爲函數的做用域鏈,它決定了哪些數據能被訪問。
當一個函數建立後,它的做用域鏈會被建立次函數的做用域中可訪問的數據對象填充。例如定義下面這樣一個函數:
function add (num1,num2) { var sum = num1+num2; return sum; }
在函數add建立時,它的做用域中會填入一個全局對象,該全局對象包含了全部對象變量,以下圖所示(注意:圖片例舉了所有變量中的一部分):
未完待續。。。。