JavaScript中的做用域和做用域鏈(邊學邊寫)[看着別人的博客純手敲]

做用域是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;
            }
View Code

在函數add建立時,它的做用域中會填入一個全局對象,該全局對象包含了全部對象變量,以下圖所示(注意:圖片例舉了所有變量中的一部分):

 

未完待續。。。。

相關文章
相關標籤/搜索