JavaScript变量范围问题:var或不变为var

时间:2009-12-24 01:48:37

标签: javascript scope var

非常感谢提前。我正在使用一本教科书而且他们正在使用一个函数调用另一个打开窗口的函数:

function rtest(){
   content='dans window';
   oneWindow=open("","Window 1","width=450,height=290");
   newWindow(oneWindow);
}
function newWindow(x){
   x.document.close();
   x.document.open();
   x.document.write(content);
   x.document.close();
   x.moveTo(20,20);
   x.focus();
}

所以一切正常,但我的问题是:newWindow()函数如何能够访问rtest()函数中“contents”变量的内容?为什么,如果我在“var”前面加上“var”,就像这样:

function rtest(){
  **var content='dans window';**
  oneWindow=open("","OneWindow","width=450,height=290");
  newWindow(oneWindow);
}

...抛出错误(新窗口的内容留空)?

有人可以向我解释使用var和不使用var之间的区别是什么?

谢谢!

丹尼尔

5 个答案:

答案 0 :(得分:6)

如果你不在rtest中使用var,它会自动成为一个全局变量。这就是为什么它可以从其他JavaScript代码访问,包括newWindow。现在,当你使用var时,它会在rtest范围内自动变量,所以现在可以使用它的是那些在同一范围内的变量。

答案 1 :(得分:5)

如果在原始函数中使用var声明变量,它将成为局部变量,并且在函数外部不可见。

如果您根本没有声明变量,那么它将是全局变量。但是,最佳实践是声明全局变量。如果您的教科书没有这样做,请考虑更换它。如果你的教授不这样做,考虑更换(或改造)他。 :-)如果你难以说服他,你可以(但不一定应该)提到我是这里的前200名用户之一。

例如:

var content;

function rtest(){
    content='dans window';
    oneWindow=open("","Window 1","width=450,height=290");
    newWindow(oneWindow);
}

此外,打开空白窗口的最佳方法是拨打open("about:blank", ...),而不是open("", ...)

答案 2 :(得分:2)

关于函数范围,如果用var声明变量,它只能在你执行它的函数范围内使用。

如果您不使用var语句,并且对未声明的标识符(未声明的分配)进行了分配,则该变量将作为Global对象的属性添加。

答案 3 :(得分:2)

如果您不使用var,那么您正在创建global variable;也就是说,可以从程序中任何位置的任何代码访问的变量。如果您使用var,则创建一个local variable,这是一个只能从定义它的scope内访问的变量(通常是它定义的函数)

虽然全局变量起初很方便,但使用它们通常是个坏主意。问题是你的所有代码都会共享一个全局变量;在将来,如果您因任何原因需要拥有该变量的两个或更多不同版本,您将无法将这两个用途分开。全局变量也可以从程序中的任何位置访问或更改,因此很难弄清楚可能正在修改的内容或取决于哪一个,而局部变量只能在代码中有限的,定义良好的部分中访问,这可以很容易被检查。

答案 4 :(得分:1)

使用var,您在函数中声明一个局部变量,因此在此函数外部不可见。如果没有var,您实际上正在处理窗口对象并设置或覆盖它的字段。客户端Javascript中的全局范围始终是窗口对象。所以你也可以写window.content ='dans window';更清楚你在那里做了什么,但否则它会是相同的。顺便说一句:窗口变量本身只是窗口对象的一个​​字段,它递归地返回窗口。