5

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

//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);
}
4

6 回答 6

20

简短的回答:,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 会在最高范围(全局)为你创建一个。在此处查看我的答案,了解隐含全局变量如何工作以获得更详细的示例,或阅读 MDN 页面,尤其是关于名称冲突的部分

最后,我想补充一点,全局变量,尤其是隐含的全局变量,是邪恶的。还要知道 ECMA6 标准显然正在远离全局变量,并引入了对真正块作用域的支持。正如你在这里看到的
哦,如果你想检查一个函数是否使用隐含的全局变量:'use strict';是一件很棒的事情:

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

如您所见,不允许使用隐含的全局变量。完整解释见MDN on strict mode

于 2012-11-29T16:46:16.530 回答
0

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

除了任何性能考虑之外,除非性能确实是一个问题,否则请坚持通用准则。在这种情况下:尽可能缩小变量的范围

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

于 2012-11-29T16:39:56.083 回答
0

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

您应该阅读有关全局变量与局部变量的本教程

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

var elements = [];
function addNumbah(number){
    elements.push(number);
}
于 2012-11-29T16:40:55.940 回答
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);
   }

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

于 2012-11-29T16:42:55.910 回答
0

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

于 2012-11-29T16:43:07.520 回答
0

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

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

专门针对简单变量,声明

var i = 0;

每次都很好。

于 2012-11-29T16:54:21.973 回答