重新定义JavaScript变量有什么意义吗?

重新定义JavaScript变量有什么意义吗?,javascript,variables,redeclaration,Javascript,Variables,Redeclaration,我是JavaScript新手 <html> <body> <script type="text/javascript"> var x=5; document.write(x); document.write("<br />"); var x; document.write(x); </script> </body> </html> 当第二次声明x时,它应该是未定义的,但它保留以前的值。请解释此重新声明是否有任何

我是JavaScript新手

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

当第二次声明
x
时,它应该是未定义的,但它保留以前的值。请解释此重新声明是否有任何特殊用途。

据我对javascript的理解,在全局范围内使用
var
关键字是完全可选的。这是一个不同的故事的功能

在函数内部时,使用
var
关键字指示变量是函数的局部变量(而不是默认为全局变量)

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

你可以参考更多信息

所以当第二次的时候,它声明的x应该是未定义的

规范的哪一部分说明了这一点


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

第二个变量x是完全多余的

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

您并不是在真正重新声明变量

JavaScript中的variable语句受提升的约束,这意味着它们在解析时进行计算,然后在运行时进行赋值

在解析阶段结束时,在执行之前,您的代码如下所示:

var x;
x = 5;

document.write(x);
document.write("<br />");
document.write(x);
varx;
x=5;
文件。编写(x);
文件。写(“
”); 文件。编写(x);
此外,程序员可能希望使用
var
对变量进行本地化:

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

var x='这是全局x';
函数my_x(){
var x='局部x';
警报(x);
}
我的_x();
警报(x);

您应该永远不要重新声明同一范围内的变量,如果您确实想更改此变量,请将其指定给它。在此动态语言中创建其他对象不需要重新声明,如果希望x是字符串,只需指定:

x = "hello";
不需要先将其设置回未定义或重新声明


请注意,在大多数情况下,更改变量类型不是很好的做法,只需说明如果您需要的话,这是一种可能性。

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
:即使在执行
foo()
的过程中从未到达
var
语句,它仍然可以有效地使
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...
}

for(var i=0;i我最近编写了如下代码:

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
的一切,因为这是一个新用法。这意味着我可以重新排序代码,或者注释掉前半部分,而不会破坏东西。

不是:如果不指定
var
,变量将落在全局范围内。var用于函数内的范围,如果不使用var,则函数内的变量将自动变为全局变量。呵呵-所有这些都在相同的20秒内完成。@Kenaniah:你应该删除你的答案,否则你很快就会面临一系列否决票的风险…我很抱歉。我忘了删除答案ion它在函数中的用法是表示局部变量(相对于全局)。虽然这个问题涉及全局范围,但我应该包括它。后期编辑;-)虽然这是可能的,并且是对它的一个很好的描述,但我不确定这是否是一个很好的实践,变量名通常不应该在不同的用途中重复。您问题的内容是关于一个具体的示例,下面已经给出了很好的回答。然而,我发现对于一个类似的问题,问题标题中的一般情况(何时/为什么要使用重新声明JavaScript变量?)得到了很好的回答。
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);