javascript - 在 Javascript 中为循环声明声明 var

标签 javascript variables for-loop scope

我确定我已经阅读了有关 SO 的讨论,但找不到它。简单地说,在循环声明中声明 for 循环的增量是否有缺点?这有什么区别:

function foo() {
    for (var i=0; i<7; i++) {
        // code
    }
}

...还有这个:

function foo() {
    var i;
    for (i=0; i<7; i++) {
        // code
    }
}

既然 JS 有函数作用域,那应该没问题吧?是否存在前一种方法会导致问题的边缘情况?

如果它们是相同的,为什么 Crockford/JSLint 都是“不可能的”?

最佳答案

这些是完全一样的。 javascript 中的所有局部变量都具有函数作用域,这意味着它们在声明它们的整个函数中都是有效的。一开始这通常是违反直觉的,因为大多数花括号语言将变量的生命周期限定在它们声明的 block 中。

一部分 Javascript 开发人员非常喜欢第二种形式。基本原理是,由于所有变量都具有函数作用域,因此即使对于那些不熟悉 Javascript 的人,您也应该在函数级别声明它们,以使生命周期明确。这只是一种风格,绝不是硬性规定

编辑

请注意,随着 ES6 let 的引入,您现在可以在循环中使用 let 获取真正的 block 范围变量 more details

for(let i = 1; i <= 5; i++) {
   setTimeout(function(){
       console.log('Value of i : ' + i);
   },100);
}

关于javascript - 在 Javascript 中为循环声明声明 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200994/

相关文章:

c - 如何在多个交互的 C 文件之间使用共享变量?

arrays - 如何在 Swift 中将字符串/数组中的所有其他字母大写?

使用 Gridster 添加网格时出现 Javascript 错误

javascript - 第 3 方脚本破坏了我的 JS

perl - 在 Perl 中迭代 bless 对象

java - 没有这样的实例字段

javascript - 由于某种原因,for 循环中的字符串增量连接忽略 "0"

python - 在Python中同时迭代2个不同的字典

javascript - 如何每 5 秒自动向下滚动 iframe 100px?

ActionScript Event.ENTERFRAME 事件的 JavaScript 版本?