如果我多次声明相同的变量,我会有任何问题吗?

Cha*_*ies 5 javascript variables

所以我想说我有一些代码:

//Javascript
var elements = [];
function addNumbah1(){
    var i = 1;
    elements.push(i);
}
function addNumbah2(){
    var i = 2;
    elements.push(i);
}
Run Code Online (Sandbox Code Playgroud)

这继续addNumbah999(),i每次声明变量是不好的形式?会破坏什么吗?我应该这样做:

//Javascript
var elements = [];
var i
function addNumbah1(){
    i = 1;
    elements.push(i);
}
function addNumbah2(){
    i = 2;
    elements.push(i);
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*gem 18

简短回答:,JS将所有变量声明提升到范围的顶部,无论您声明它们多少次:

var i = 0
for (var i=0;i<10;i++)
{
    var j = i%2;//declared 10 times, on each iteration
}
Run Code Online (Sandbox Code Playgroud)

将被翻译成

var i, j; //i is undefined at this point in the code.
for (i = 0;i<10;i++)
{
    j = i%2;//declared 10 times, on each iteration
}
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您将声明i为函数范围中的变量,这是您必须要做的,以避免混淆全局范围.这些变量使用的内存在调用函数时分配,并在函数返回时释放(粗略地说,闭包形成一个异常,但这会把我们带到远处).考虑一下:

var i = 10;
function someF()
{
    var i = 1;
    alert(i);
}
someF();//alerts 1 <-- value of i, local to someF
alert(i);//10, global i is unchanged
Run Code Online (Sandbox Code Playgroud)

但如果你要省略var:

function someF()
{
    i = 1;
    alert(i);
}
Run Code Online (Sandbox Code Playgroud)

你会看到1被提醒两次.如果JS在当前作用域中找不到变量声明,它将在更高的作用域中查找,直到找到var.如果没有找到变量,JS将在最高范围(全局)中为您创建一个变量.在这里查看我的答案,了解隐含的全局变量如何用于更详细的示例,或者阅读MDN页面,尤其是关于名称冲突的部分

最后,我想补充一点,全局变量,特别是隐含的全局变量,都是邪恶的.还要知道ECMA6标准明显偏离了全局变量,并引入了对真正的块范围的支持.正如你在这里看到的
哦,如果你想检查函数是否使用隐含的全局变量:'use strict';是一件好事:

(function()
{
    'use strict';
    var localVar = 123;//ok
    impliedGlobal = 123;//TypeError!
}());
Run Code Online (Sandbox Code Playgroud)

如您所见,不允许使用隐含的全局变量.有关完整说明,请参阅严格模式下的MDN