天天看點

javascript 作用域、作用域鍊了解

javascript作用域就是變量和函數的可通路範圍。

1.變量作用域

   在javascript中,變量作用域分為全局作用域和局部作用域。

    全局作用域

      任何地方都可以定義擁有全局作用域的變量

      1.沒有用var聲明的變量(除去函數的參數)都具有全局作用域,成為全局變量,是以聲明局部變量必須要用var

      2.window的所有屬性都具有全局作用域

      3.最外層函數體外聲明的變量也具有全局作用域 

javascript 作用域、作用域鍊了解
javascript 作用域、作用域鍊了解

    局部作用域

      1.函數體内用var聲明的變量具有局部作用域,成為局部變量

      2.函數的參數也具有局部作用域   

javascript 作用域、作用域鍊了解
javascript 作用域、作用域鍊了解

  總結:在函數體内局部變量的優先級高于同名的全局變量,聲明局部變量必須用var

 2.函數作用域

 一些類c語言是塊級作用域(block scope),每一個花括号是一個作用域,花括号内的代碼對外是不可見的。而

javascript是函數作用域(function scope),沒有塊級作用域。無論函數體内的變量在什麼地方聲明,對整個函數都是可見的,即javascript函數裡聲明的所有變量都被提前到函數體的頂部,隻是提前變量聲明,變量的指派還是保留在原位置

 函數作用域隻能用函數來聲明獨立作用域,并不是每一個花括号都是一個獨立作用域,例如:for循環并不能建立一個局部的作用域

javascript 作用域、作用域鍊了解
javascript 作用域、作用域鍊了解

 3.作用域鍊  

 作用域鍊:javascript的變量都是對象的屬性,而該對象可能又是其它對象的屬性,而所有的對象都是全局對象的屬性,是以這些對象的關系可以看作是一條鍊, 

鍊頭就是變量所處的對象,鍊尾就是全局對象

在查找變量funscope的值時,會先查找目前對象,如果目前對象查不到就繼續查找作用域鍊上面的下一個對象,如果作用域鍊上沒有一個對象包含此屬性,就抛出引用錯誤。

在不包含嵌套的函數體内,作用域鍊上有兩個對象:

 1.定義函數參數和局部變量的對象

 2.全局對象

在包含嵌套的函數體内,作用域鍊上至少有三個對象

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/greenteaone/p/4201309.html

繼續閱讀