Javascript解析之作用域理解
學習任何程式語言,都逃不過理解變數的作用域。
在javascript中,變數的作用域有全域性(window物件)作用域和函式呼叫作用域。
以下變數具有全域性作用域
1. 所有在最外層定義(非函式體內定義)的變數都擁有全域性作用域
2. 所有末定義直接賦值的變數,系統會自動宣告為擁有全域性作用域的變數
3. 所有window物件的屬性擁有全域性作用域
以下變數具有函式作用域
1. 在函式體內部用var定義的變數,這裡要注意一點,只要是在函式裡定義的變數,就算是在最後一句定義,該變數也擁有整個函式的作用域。
特別應該說明的一點是,作用域是層層包含的,最外層是全域性作用域,裡面可以包含函式呼叫作用域,函式呼叫作用域裡面還可以再有函式作用域,下面,我們看一個簡單的例子:
這個例子說明了簡單的全域性作用域和函式作用域的區別,我們再思考一下問題,如果函式f1裡面沒有變數scope,而全域性作用域裡面有這個變數,會有什麼情況呢?
為什麼會這樣呢,這是由於javascript的尋找變數的機制造成的。上面己經說了,作用域是層層包含的,上面的這個例子的層次應該是這樣的: 全域性作用域->f1的作用域。而javascript查詢一個變數時,會從當前作用域往上找,直到找到為止,所以這個例子中,先在f1的作用域找scope,找不到,則到外層的全域性作用域找,在全域性作用域中找到了scope,就使用該變數,這個例子中,如果在全域性作用域也找不到變數scope,則會報錯。
下面我們把這個例子改一下,就會有一個很有趣的現象
這裡還是用javascript查詢變數的機制來解釋,首先在f1的作用域裡面找,而f1定義了該變數,所以使用該變數,但是還末賦值,所以是undefined。這裡要說明一點,就是作用域內的變數不管在函式的哪裡宣告,javascript都會在函式執行前在作用域內包含該變數。
下面,我們再看複雜一些的例子:
下面,我們還是以javascript查詢變數的機制來解釋一下。首先,我們看看作用域的包含情況: 全域性作用域-> f1的作用域 ->f2的作用域-> f3的作用域。對於變數scope,先在f3作用域內找,沒找到,往外,在f2作用域裡找到,使用該值,所以打出的值為 function2。對於scope2,先在f3找,沒找到,住外,在f2找,還是沒找到,再往外,在f1找,找到,使用該值,所以打出的值為function1-scope2。
上面的函式都是在定義該函式的作用域裡呼叫,如f3 在f2定義並呼叫,f1在全域性作用域裡定義並在全域性作用域呼叫,那麼,如果在全域性作用域呼叫,或是在別的函式裡呼叫f3會有什麼情況呢?下面我們試一下:
上面的例子我們返回f3,並在f4裡面呼叫f3,但結果沒變,為什麼呢?這是因為javascript的作用域包含關係是在函式定義的時候確定的,而不是在呼叫的時候確定的,所以不管在哪呼叫f3,函式的作用域包含關係都是: 全域性作用域->f1->f2->f3。不過上面的這個例子還有另外一個作用域包含關係: 全域性作用域->f4的作用域。
最後,還要說明的是,javascript沒有塊作用域,這點跟java,c++,c#,php等都是不同的,所以在迴圈語句裡面建立的變數也是擁有函式呼叫作用域或是全域性作用域的,並不會有臨時變數存在。
注:
1.在javascript裡,函式也是可以作為資料傳遞的,在上面的例子裡用到了函式作用資料傳遞
2.上面的例子用到了閉包的知識,不清楚的朋友可以瞭解一下相關的知識
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-701877/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解 Javascript 之 作用域JavaScript
- JavaScript深度理解——作用域JavaScript
- 深入理解JavaScript作用域和作用域鏈JavaScript
- 理解 JavaScript 中的作用域JavaScript
- 深入理解JavaScript作用域JavaScript
- 深入理解javascript系列(六):作用域與作用域鏈JavaScript
- (譯)理解javascript中的作用域JavaScript
- FE.ES-理解ECMA Javascript作用域JavaScript
- 理解JavaScript的核心知識點:作用域JavaScript
- JavaScript之變數及作用域JavaScript變數
- JavaScript 作用域 與 作用域鏈JavaScript
- javaScript 作用域JavaScript
- JavaScript作用域JavaScript
- javascript之作用域與作用域鏈JavaScript
- 為何你始終理解不了JavaScript作用域鏈?JavaScript
- JavaScript之作用域鏈JavaScript
- 學習JavaScript作用域JavaScript
- JavaScript 塊級作用域JavaScript
- javascript 詞法作用域JavaScript
- 淺談JavaScript作用域JavaScript
- 圖解javascript作用域圖解JavaScript
- 徹底搞懂JavaScript作用域JavaScript
- 談談 JavaScript 的作用域JavaScript
- Javascript-this/作用域/閉包JavaScript
- JavaScript高階特性 — 作用域JavaScript
- JS閉包作用域解析JS
- js基礎梳理-如何理解作用域和作用域鏈?JS
- JavaScript 之有趣的函式(函式宣告、呼叫、預解析、作用域)JavaScript函式
- JavaScript之作用域和閉包JavaScript
- JavaScript中變數和作用域JavaScript變數
- 淺淺淺談JavaScript作用域JavaScript
- JavaScript 變數的作用域鏈JavaScript變數
- 對js中執行環境、作用域和作用域鏈的理解JS
- 深入理解閉包之前置知識→作用域與詞法作用域
- javascript 基礎(作用域和閉包)JavaScript
- 晝貓筆記 JavaScript — 作用域技巧!!筆記JavaScript
- JavaScript作用域相關的總結JavaScript
- JavaScript執行環境及作用域JavaScript
- JavaScript塊級作用域宣告函式JavaScript函式