重新声明JavaScript变量有什么目的吗?

War*_*ior 6 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>
Run Code Online (Sandbox Code Playgroud)

结果是:

5
5
Run Code Online (Sandbox Code Playgroud)

何时x声明第二次它应该是未定义的,但它保留了先前的值.请解释这种重新声明是否有任何特殊目的.

CMS*_*CMS 20

你并没有真正重新声明变量.

JavaScript中的变量语句需要提升,这意味着它们在分析时进行评估,之后在运行时进行分配.

您在解析阶段结束时的代码,在执行之前看起来像这样:

var x;
x = 5;

document.write(x);
document.write("<br />");
document.write(x);
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 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);
Run Code Online (Sandbox Code Playgroud)

结果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...
}
Run Code Online (Sandbox Code Playgroud)

虽然你当然可以省略第二种var,并且jslint需要你这样做的工具,但它实际上可能并不是一个好主意.

想象一下,你在以后更改或删除第一个循环,使其不再宣称ivar.现在剩下的第二个循环突然改变了从局部变量到全局变量的含义.如果你在更新第一个循环时没注意到第二个循环对它有一个隐藏的依赖(并且你很可能没有注意到,鉴于眼睛如何将模式忽略for(...=0 ; ...<...; ...++)为"哦,那只是一个标准的迭代器"),你有一个微妙和烦人的调试问题.