【问题标题】:for loop and iterator variable's scopefor 循环和迭代器变量的范围
【发布时间】:2013-12-30 18:58:44
【问题描述】:

我在一个长脚本中添加了一些新功能,其中许多变量被缩小(只有一个字母)。

添加 for 循环时,我必须检查很多用于迭代的传统 i 变量是否可用。即在此脚本范围内之前未采用/定义。

我的第一个想法是这样定义它:

(function () {
    for (var i = 0; i < 20; ++i) {
        console.log(i);    // logs 1 to 19
    }
})()
console.log('After is: ' + typeof i); // After is: undefined 

有没有更好的方法来做到这一点?在这种情况下,人们还可以考虑哪些其他方式?

【问题讨论】:

  • 你为什么要编辑缩小版?您应该编辑非缩小版本。您的真实代码应该使用有意义的变量名。
  • 您的函数需要多长时间才能在中间引入 IIFE 以限定i 变量的范围?为什么不把它分解成单独的命名函数呢?
  • @RocketHazmat,我同意你的看法。脚本就是这样,我(不幸的是)必须照原样使用它。但我确实在我添加的部分中添加了正确/清晰的变量,并在需要时进行评论。

标签: javascript for-loop scope


【解决方案1】:

修复脚本不使用单字母变量。但除此之外,请改用函数:

function repeat(fun, times) {
    // Since JavaScript is function scoped
    // `i` will not leak out of the `repeat`
    // function.  We will not be able to access
    // `i` from a higher scope in this function,
    // but, we can assume that is unnecessary.
    for (var i = 0; i <= times; i++) {
        fun(i);
    }
}

var i = "some value";
repeat(function(index) {
    console.log("Index is:", index);
    console.log("`i` remains:", i);
}, 10);
console.log("After call, `i` is:", i);

【讨论】:

  • +1 与使用 IIFE 相比,这是解决此问题的最佳方法 :-)
  • +1 - 将函数作为函数参数传递的有趣解决方案!为什么这比 IIFE 更好?
  • @Rikard:它是可重复使用的!你不需要到处写(function(){}())
  • @Rikard - 这样我们就可以在修复脚本后轻松找到并替换所有这些调用 :-)
  • 太棒了 - 很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2023-03-31
相关资源
最近更新 更多