javascript作用域和作用域鏈簡單介紹
只要是一門程式語言,那麼作用域就是一個不可逃避的問題,下面就通過例項簡單介紹一下javascript的作用域和作用域鏈。
在javascript中,作用域分為兩種:
1.全域性作用域
2.區域性作用域。
如何界定是何種作用域:
1.定義在所有函式之外的變數是具有全域性作用域。
2.定義在函式之內的變數具有區域性作用域,它的作用域就是變數所在的函式。
特別說明:所有末定義直接賦值的變數具有全域性作用域。
作用域與作用域之間是可以層層包含的:
全域性作用域可以包含區域性作用域,區域性作用域中又可以巢狀其他區域性作用域,可以如此無限的巢狀下去。
面羅列幾個例項加深一下對概念的理解:
例項一:
[HTML] 純文字檢視 複製程式碼<script type="text/javascript"> var x="全域性變數x"; var y="全域性變數y"; function myfunction(){ var x="區域性變數x"; var z="區域性變數z"; alert(x);//彈出"區域性變數x" alert(y);//彈出"全域性變數y" } myfunction(); alert(z);//不能彈出內容。 </script>
在以上程式碼中,當執行myfunction()函式的時候能夠分別彈出”區域性變數x“和"區域性變數y"。但是alert(z)不能彈出內容,因為z變數是定義在函式內的區域性變數,不能夠在函式體外使用。
從上面的程式碼可以對區域性變數和全域性變數有一個基本的瞭解,要特別主要的是,如果區域性變數和全域性變數同名,那麼區域性變數將會覆蓋全域性變數,具體原因在後面有介紹。
例項二:
[HTML] 純文字檢視 複製程式碼<script type="text/javascript"> var x="全域性變數x"; var y="全域性變數y"; function myfunction(){ var x="區域性變數x"; var z="區域性變數z"; m="全域性變數m"; alert(x);//彈出"區域性變數x" alert(y);//彈出"全域性變數y" } myfunction(); alert(m);//彈出"全域性變數m" </script>
在以上程式碼中,當執行myfunction()函式的時候能夠分別彈出”區域性變數x“和"區域性變數y"。alert(m)能夠彈出"全域性變數m",儘管m是在函式體內宣告並賦值的,但是並沒有使用var關鍵字,所以變數m的作用域是全域性的。
例項三:
[HTML] 純文字檢視 複製程式碼<script type="text/javascript"> var x="全域性變數x"; var y="全域性變數y"; function myfunction(){ var x="區域性變數x"; var z="區域性變數z"; m="全域性變數m"; alert(x);//彈出"區域性變數x" alert(y);//彈出"全域性變數y" function innerfunction(){ var xx="區域性變數xx"; alert(xx);//彈出"區域性變數xx" alert(z);//彈出"區域性變數z" } innerfunction(); alert(xx)//無法彈出 } myfunction(); alert(m);//彈出"全域性變數m" </script>
以上程式碼中,進行了函式的巢狀,也就是實現了作用域的巢狀。執行結果這裡就不一一介紹了,和上面原理是一樣的,需要特別說明的是,alert(xx)之所以不能夠彈出內容,因為xx變數的作用域是innerfunction()函式,並且在myfunction()函式和全域性作用都沒有關於xx變數的宣告。
經過上面的幾個例項以後,對作用域有了初步的瞭解,下面再來介紹一下javascript的變數的查詢機制,就能明白為什麼看起來同名的區域性變數能夠覆蓋全域性變數。
以例項三作為一個例子,innerfunction()函式的alert(z)語句,這個時候就首先在innerfunction()函式作用域內查詢,如果不存在,則向上在myfunction()函式作用域中查詢,如果有就彈出變數值,沒有則繼續向上查詢,如此則形成了一個作用域鏈。
特別說明:在javascript中不具有塊級作用域,例如for迴圈語句不能形成一個作用。
相關文章
- javascript作用域簡單介紹JavaScript
- js 函式作用域鏈簡單介紹JS函式
- JavaScript 作用域 與 作用域鏈JavaScript
- 深入理解JavaScript作用域和作用域鏈JavaScript
- javascript之作用域與作用域鏈JavaScript
- js 作用域和作用域鏈JS
- javascript作用域鏈JavaScript
- javascript函式讀取變數作用域簡單介紹JavaScript函式變數
- js的作用域和作用域鏈JS
- javascript資料型別和作用域介紹JavaScript資料型別
- JavaScript之作用域鏈JavaScript
- javascript作用域鏈理解JavaScript
- js的作用域、作用域鏈JS
- 深入理解javascript系列(六):作用域與作用域鏈JavaScript
- JavaScript深入之作用域鏈JavaScript
- JavaScript 深入之作用域鏈JavaScript
- 理解JavaScript的作用域鏈JavaScript
- js的作用域與作用域鏈JS
- 原型、原型鏈、作用域、作用域鏈、閉包原型
- javascript作用域簡單例項程式碼JavaScript單例
- JavaScript 變數的作用域鏈JavaScript變數
- javaScript 作用域JavaScript
- JavaScript作用域JavaScript
- JavaScript 深入之詞法作用域和動態作用域JavaScript
- js基礎梳理-如何理解作用域和作用域鏈?JS
- 深入理解javascript原型和閉包(12)——簡介【作用域】JavaScript原型
- javascript變數作用於簡單介紹JavaScript變數
- 淺談Javascript中的作用域鏈JavaScript
- 我所認識的 JavaScript 作用域鏈和原型鏈JavaScript原型
- 深入理解javascript作用域系列第二篇——詞法作用域和動態作用域JavaScript
- 理解 JavaScript 作用域JavaScript
- 詞法作用域和動態作用域
- 對js中執行環境、作用域和作用域鏈的理解JS
- JavaScript中變數和作用域JavaScript變數
- JavaScript之作用域和閉包JavaScript
- javascript 作用域和 this 關鍵字JavaScript
- python函式作用域簡介Python函式
- 擒賊先擒王,簡單談一下JavaScript作用域鏈(Scope Chain)JavaScriptAI