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

时间:2012-11-29 16:34:34

标签: javascript variables

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

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

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

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

6 个答案:

答案 0 :(得分:18)

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

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

将被翻译为

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
}

在第一个示例中,您将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

但是如果你要省略var

function someF()
{
    i = 1;
    alert(i);
}

你会看到1被提醒两次。如果JS在当前作用域中找不到变量声明,它将在更高的作用域中查找,直到找到var。如果没有找到变量,JS将在最高范围(全局)中为您创建一个变量。 Check my answer here关于隐含的全局变量如何用于更详细的示例,或read the MDN pages,尤其是关于名称冲突的部分

最后,我想补充说全局变量,尤其是隐含的全局变量,是 evil 。还要知道ECMA6标准明显偏离了全局变量,并引入了对真正的块范围的支持。 As you can see here
哦,如果你想检查函数是否使用隐含的全局变量:'use strict';是一件好事:

(function()
{
    'use strict';
    var localVar = 123;//ok
    impliedGlobal = 123;//TypeError!
}());

如您所见,不允许使用隐含的全局变量。有关完整说明,请参阅MDN on strict mode

答案 1 :(得分:0)

第二种形式,全局i可能实际上有点慢,因为它是在更高的范围内定义的,而在更高范围内定义的变量需要更长的时间才能解决。

除了性能方面的考虑之外,只需坚持使用通用指南,除非性能确实存在问题。在这种情况下:尽可能缩小变量的范围

我强烈建议您使用第一种形式。

答案 2 :(得分:0)

你做的第一种方式很好。 i的每个实例都不会知道其他函数中的其他i。

您应该在global versus local variables

上阅读本教程

另外,我可以建议优化吗?为什么不能只执行以下操作来覆盖任何数字(而不是每个数字的单独功能)?

var elements = [];
function addNumbah(number){
    elements.push(number);
}

答案 3 :(得分:0)

你可以多次声明一个变量..在你的代码中,你在这里声明变量i在不同的范围内:

   //Here you are declaring variable i local to addNumbah1,2 functions 
   var elements = [];
   function addNumbah1(){
       var i = 1; 
       elements.push(i);
   }
   function addNumbah2(){
       var i = 2; 
       elements.push(i);
   } 


   //Here v /variable i has been declared globally
   var elements = [];
   var i
   function addNumbah1(){
       i = 1;   
       elements.push(i);
   }
   function addNumbah2(){
       i = 2;  
       elements.push(i);
   }

请注意,虽然您可以多次声明变量但通常不是一个好的编程习惯,因为它可能会导致应用程序中出现错误/问题

答案 4 :(得分:0)

可以在不同的函数中声明具有相同名称的变量。

答案 5 :(得分:0)

在函数内声明的变量只存在于该函数的范围内,因此在不同函数中具有相同的变量名称不会破坏任何内容。

事实上,将变量保持在尽可能小的范围内是一种很好的形式!全局变量可能难以管理,并且可能会产生非常糟糕的错误,尤其是当另一个函数试图访问它时,使用该变量不能完成一个函数。

特别是对于简单变量,声明

var i = 0;
每次都很好。