【问题标题】:Why is CoffeScript not "reusing" loop variable?为什么 CoffeeScript 不“使用”循环变量?
【发布时间】:2012-08-14 19:52:42
【问题描述】:

我是 CoffeeScript 的新手,对此非常兴奋。我做了一些基本的循环here。现在,CoffeeScript 正在为 每个 循环定义一个循环变量,如下所示:

var food, _i, _j, _len, _len1;

for (_i = 0, _len = fruits.length; _i < _len; _i++) {
  food = fruits[_i];
  console.log(food);
}

for (_j = 0, _len1 = vegetables.length; _j < _len1; _j++) {
  food = vegetables[_j];
  console.log(food);
}

我曾经这样编写循环代码:

for(var i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

for(var i = 0; i < vegetables.length; i++) {
    console.log(vegetables[i]);
}

i 是我的 every 循环的循环变量(不包括嵌套循环)。现在我了解到,您应该始终在定义变量之前声明它。所以我改变了我的编码习惯:

var i;
for(i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

for(i = 0; i < vegetables.length; i++) {
    console.log(vegetables[i]);
}

只要我在同一个范围内,我就没有发现任何问题,但编译后的 CoffeeScript 代码让我感到疑惑。

为什么 CoffeeScript 会为 每个 循环使用不同的变量?

【问题讨论】:

    标签: javascript loops coffeescript


    【解决方案1】:

    在没有查看 CoffeeScript 源代码的情况下,这是我的(受过教育的)猜测:

    CoffeeScript 解释器只是为您编写的每个for .. in 创建一个新的for 循环结构。在构建输出 JS 时,它会维护一个局部变量名称表,并根据需要附加到该表中。

    毕竟,您可以嵌套这些for .. in 循环,在这种情况下,无论如何您都需要在JS 中使用单独的循环变量。

    有必要跟踪局部函数范围内的哪些变量可能被重用。这是可能的,但比它的价值更复杂——它根本没有提供任何好处,所以 CoffeeScript 没有这样做。

    【讨论】:

    • 如果您手动执行它可能会很棘手,但是由于 CoffeeScript 以编程方式编译 JS,我认为有一种方法可以跟踪是否可以“重用”某些变量。在源代码中减少变量声明是一种好处,不是吗?
    • @Amberlamps 不,这还不足以解决麻烦。 JavaScript 中的变量并不十分昂贵。相比之下,实现一个跟踪哪些要重用 的逻辑是昂贵的。仅仅因为 _i 已经存在而阻止声明 _j 的好处是可以忽略不计的。
    • 我明白了,但逻辑必须仅在开发模式下跟踪。一旦您进入生产模式,您的客户就会使用已编译的 JS。
    • @Amberlamps 正确。但重点在于它不会在客户端机器上提供任何好处(无论是在性能方面还是在内存方面),同时增加了解释器的复杂性。为什么要重复使用循环变量? 99.99% 的用户不会看到、关心或注意到。
    • 我认为可能有一个更有说服力的论据。但我对你的权衡解释很满意:)
    【解决方案2】:

    另一方面,CS 不能指望你只使用循环内的变量。虽然依赖迭代变量在循环外使用可能很危险,但您可能会想要这样做。如果它总是使用相同的变量,CS 重用它不会给你这个机会。

    【讨论】:

    • CS 源中不存在该变量。
    • 我不是 CS 用户,所以我相信你的话。但是没有办法访问迭代变量吗?对于更复杂的循环函数,似乎有一种方法可以访问这个变量。但同样,不是 CSer,所以如果这是强制执行的严格性,我想这可能是一件好事。
    • 他发了一个链接到源:coffeescript.org/…
    • 你可以说 for e in array 来获取 OP 正在做什么,或者说 for e, i in array 来获取索引。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2014-10-17
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多