2009-12-08 28 views
6

我是JavaScript新手。是否有任何目的来重新声明JavaScript变量?

<html> 
<body> 
<script type="text/javascript"> 
var x=5; 
document.write(x); 
document.write("<br />"); 
var x; 
document.write(x); 
</script> 
</body> 
</html> 

结果是:

5 
5 

x声明应该是不确定的第二次,但它会保持以前的值。请说明这一重新宣布是否有任何特殊用途。

+0

你的问题的内容是关于一个具体的例子,下面已经得到了充分的回答。然而,我发现[这个答案](http://stackoverflow.com/a/12889928/983430)给类似的问题回答了一般情况(何时/为什么会重新声明一个JavaScript变量被使用?你的问题真的很好。 – 2012-10-31 09:05:57

回答

20

你并没有真的重新声明变量。

JavaScript中的变量声明,是受吊装,这意味着它们在运行的分配是由在分析时和后评估。

您的代码在分析阶段结束后,执行前看起来是这样的:

var x; 
x = 5; 

document.write(x); 
document.write("<br />"); 
document.write(x); 
+0

谢谢,现在我很清楚 – Warrior 2009-12-08 01:52:12

0

就我对javascript的理解而言,在全球范围中使用var关键字是完全可选的。对于功能来说这是一个不同的故事。

在函数内部时,使用var关键字指示该变量对函数是本地的(与默认情况下为全局相对)。

我个人在全球范围内使用var来表明变量是第一次被声明和/或使用。

有关更多信息,可以参考http://www.w3schools.com/js/js_variables.asp

+2

不,它不是:没有指定'var',一个变量将落入全局范围。 – jldupont 2009-12-08 01:33:33

+0

var用于函数内的作用域,如果你不使用var,它将自动成为全局函数。 – 2009-12-08 01:33:51

+0

heh - 全部在相同的20秒内。 – 2009-12-08 01:34:33

1

故当其宣布x应是不确定的

什么说明书的一部分说,这第二次?

“未定义的行为”并不意味着“该变量将为undefined”。

0

那第二个var x是完全多余的。

0

相同范围中,“重新声明”变量是完全没有必要的。

0

此外,程序员可能要使用var本地化变量:

<script> 
var x= 'this is global x'; 
function my_x() { 
var x= 'localized x'; 
alert(x); 
} 
my_x(); 
alert(x); 
</script> 
+0

虽然这是可能的和很好的描述,我不确定这是一个非常好的做法,变量名不应该重复不同的使用。 – Jay 2009-12-08 01:46:00

0

你应该永不重新声明一个变量在同一范围内,如果你真的想改变这个然后分配给它。重新说明不需要在这个充满活力的语言来创建不同的对象,如果你想X是一个字符串只是分配:

x = "hello"; 

不要求您将其设置回undefined或第一重新声明。

请注意,在大多数情况下更改变量类型并不是很好的做法,只是简单地指出如果这就是您所需的可能性。

7

var单独不执行任务。它只会标记在整个var发生的范围内使用变量名时,您所谈论的是局部变量而不是全局(有争议的缺省值)。当函数解析以及遍及范围保持var被发现,所以你把它是无关紧要:

var a= 0; 

function foo() { 
    a= 1; 
    return a; 
    var a; 
} 

var b= foo(); 
alert('global a='+a+', local a='+b); 

结果global a= 0, local a= 1:即使var声明从未在foo()执行过程中达成,将a作为局部变量仍然有效。

因此,在同一范围内第二次申报var x是完全多余的。但是,有时您仍然可以执行此操作,通常在同一个函数中重新使用局部变量名称进行第二次独立使用时。最常见的是:

for (var i= 0; i<onething.length; i++) { 
    ...do some trivial loop... 
} 

for (var i= 0; i<anotherthing.length; i++) { 
    ...do another trivial loop... 
} 

虽然你当然可以省略第二var和工具,如jslint会要求你这样做,它可能实际上不是一个好主意。

想象一下,您稍后更改或删除第一个循环,以便它不再声明ivar。现在剩下的第二个循环突然将含义从本地变为全局变量。如果你在更新第一个循环时没有注意到第二个循环对它有一个隐藏的依赖关系(并且你可能很好地没有注意到,鉴于眼睛如何将模式for(...=0 ; ...<...; ...++)变成“哦,这只是一个标准迭代器”),你有一个微妙而烦人的调试问题。

0

我最近写了这样的代码:

var obj1 = get_an_object(); 
var v = obj1.get_velocity(); 
v += changes_in_velocity(); 
obj1.set_velocity(v); 

var obj2 = get_an_object(); 
var v = obj2.get_velocity(); 
v += changes_in_velocity(); 
obj2.set_velocity(v); 

(实际的代码更复杂,更重复)

至于浏览器而言,第二var v说法是多余的,毫无意义的。对我来说,它有两个目的。它说忘记我对旧的v知道的一切,因为这是一种新的用法。这意味着我可以重新排序代码,或者在不破坏事情的情况下评论上半场。