2009-09-21 118 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,它是内 功能必要在下列情况下:

  • 如果在含有功能(包括全局 范围内)一个范围的变量具有相同的名称。
  • 如果递归函数或多个函数使用具有相同名称的变量,并且 打算将这些变量设为本地变量。

未声明变量在 这些情况下,很可能会导致 意想不到的效果。