3

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

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”,就像这样:

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

...是否会引发错误(并且新窗口的内容留空)?

谁能向我解释使用 var 和不使用 var 之间的区别是什么?

谢谢!

丹尼尔

4

5 回答 5

6

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

于 2009-12-24T01:51:34.993 回答
5

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

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

例如:

var content;

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

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

于 2009-12-24T01:54:32.353 回答
2

这是关于函数范围的,如果您使用 声明变量var,它将仅在您执行它的函数范围内可用。

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

于 2009-12-24T01:56:52.457 回答
2

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

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

于 2009-12-24T01:58:43.937 回答
1

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

于 2009-12-24T01:57:52.643 回答