2009-09-21 444 views
1

我曾經遇到過以下好奇的一段代碼:範圍在JavaScript

function foo(){ 
    works = {hello:"world"}; 
    function bar(){ 
     alert('does not work'); 
    } 
    var notwork = {hello:"world"}; 
} 
foo(); 
alert(works.hello); 
alert(notwork.hello); 

可有人請給我爲什麼工程工作,notwork不起作用解釋?或者指出一個很好的資源,詳細解釋這一點。

非常感謝!

回答

11

var notwork創建一個局部變量,該變量僅對該函數的運行時有效。

作品創建一個在整個javascript運行時都有效的全局變量。

+3

編號局部變量在函數執行後非常有效。這就是Javascript有閉包**的原因。 – kangax 2009-09-21 23:47:34

+0

盡我所知,在這個例子中,變量在函數執行後是無效的。糾正我,如果我錯了,謝謝! – 2009-09-22 12:17:47

2

您錯過了var關鍵字,因此works正在全局對象上定義。

你想

var works = ... 
3

var變量聲明爲「本地」,以它定義的函數

沒有var,你works變量是全球性的。可以看出/瀏覽/從使用任何地方。

對於var,您的notwork變量侷限於foo函數:它不能在該函數之外看到/使用。


欲瞭解更多信息,你可以去看看var statement on MDC的文件,其中規定(引用)

一個變量的作用域是當前 功能,或變量申報 外功能,目前 申請。

使用var以外的功能是 可選;爲 未聲明的變量隱式賦值 將其聲明爲全局變量。
然而,建議總是 使用var,它是內 功能必要在下列情況下:

  • 如果在含有功能(包括全局 範圍內)一個範圍的變量具有相同的名稱。
  • 如果遞歸函數或多個函數使用具有相同名稱的變量,並且 打算將這些變量設爲本地變量。

未聲明變量在 這些情況下,很可能會導致 意想不到的效果。