【问题标题】:Using var when declaring i in a for loop [duplicate]在 for 循环中声明 i 时使用 var [重复]
【发布时间】:2015-06-02 04:15:01
【问题描述】:

我见过使用两种不同方式定义 for 循环的 Javascript 代码。

for (var i=0;i < x.length; i++)

但也有过

for (i=0; i < x.length; i++)

for-in 循环也发生了同样的事情

for (var i in x)

for (i in x)

i 声明为var 和只说i 之间有什么区别吗?做一个比另一个有优势吗?这些是正确的方法之一吗?据我所知,它们的行为相同,但肯定有一些不同。

注意:我不是在问for-infor (i=0) 之间的区别

【问题讨论】:

    标签: javascript for-loop


    【解决方案1】:

    如果函数中没有var 声明,对i 的引用将指向全局对象的i 属性。如果for 循环体中的代码调用的代码(例如,在被调用的方法中)也修改了全局i,则这可能会导致各种不可预知的行为。

    注意在for循环初始化中声明var i

    for (var i = ...)
    

    相当于在for循环之前声明var i;

    var i;
    for (i = ...)
    

    特别是,i 的声明将是 hoisted 到封闭范围的顶部。

    编辑:如果您启用strict mode,那么您必须声明您的循环变量(实际上是所有变量)。引用未使用 var 语句声明的变量将导致抛出 ReferenceError(而不是导致全局变量存在)。

    【讨论】:

      【解决方案2】:

      JavaScript 是功能范围的。至少目前,该语言没有块级变量。

      当你写for (var i=0; ... );时它和

      一样
      var i;
      for (i=0; ... );
      

      如果没有"use strict";,变量声明将是hoisted

      for (i=0; ... ); 单独暗示i 属于全局(最顶层)对象(在浏览器中它是window

      【讨论】:

      • 即使在严格模式下,变量声明也会被提升;严格模式的作用是在引用未声明的变量时引发ReferenceError
      【解决方案3】:

      简介:

      for 语句创建一个包含三个可选的循环 表达式

      Source: Mozilla JavaScript Docs

      背景:

      您指的是初始化,它是一个表达式或变量声明。它几乎总是用于初始化一个计数器变量,该变量允许我们像您所展示的那样遍历一个集合。

      此表达式可以选择使用 var 声明新变量 关键词。这些变量不是循环的本地变量,即它们在 for 循环所在的范围相同。这个表达式的结果是 丢弃。

      在 JavaScript 中,变量可以保存不同的数据类型,对于计数器变量,JavaScript 将变量视为数字。

      答案:

      之所以可以选择声明一个新变量(或者根本不声明,正如您所强调的那样)是由于 JavaScript 编程语言的性质。您已经发现了处理变量和范围的语言的一个重要方面。

      “变还是不变”

      请参阅有关使用 var 或根本不使用它的其他帖子以了解更多信息...

      What is the function of the var keyword and when to use it (or omit it)?

      【讨论】:

        【解决方案4】:

        如果您说开始使用“i”而没有先说“var”,那么您应该在 for 循环之前声明变量。 喜欢:

        var i;
        for (i = 0; i < x; i++) {
          doSomething();
        }
        
        ==OR==
          
        for(var i = 0; i < x; i++){
          doSomething();  
        }

        【讨论】:

        • Javascript 通常允许您滥用某些东西,但这也可能导致意外行为,正如@Ted Hopp 所说。
        猜你喜欢
        • 2012-02-01
        • 2012-04-29
        • 2012-09-19
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 2013-04-26
        • 2018-04-25
        • 1970-01-01
        相关资源
        最近更新 更多