重新定义JavaScript变量有什么意义吗?
我是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时,它应该是未定义的,但它保留以前的值。请解释此重新声明是否有任何
<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);