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

JavaScript variable scope question: to var, or not to var

提前谢谢了。 我正在制作一本教科书,他们正在使用一个函数调用另一个打开一个窗口的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
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"前面添加"内容"变量,就像这样:

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

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

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

谢谢!

丹尼尔


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


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

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

例如:

1
2
3
4
5
6
7
var content;

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

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


如果你不使用var,那么你正在创建一个全局变量;也就是说,可以从程序中任何位置的任何代码访问的变量。如果使用var,则表示您正在创建一个局部变量,该变量只能从定义它的范围内访问(通常是在其中定义的函数)。

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


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

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


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