如何在CoffeeScript 2中正确使用循环内的函数?

问题描述 投票:0回答:1

1.总结

我找不到,2024 年 CoffeeScript 2 中在循环内使用函数的正确方法是什么(或者用什么替换它)。

我应该使用下面给出的变体之一,还是 CoffeeScript 有更好的解决方案?

2. MCVE

我需要在循环内运行一个函数。我的 MCVE 中的 全局函数

setTimeout()
只是为了让 MCVE 变得简单。在实际项目中我使用其他函数。

数组示例:

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"]

我想得到这个控制台输出:

Kira is Goddess!
Kira is Ideal!
Kira is Perfection!

3.没有帮助

3.1。 “for…of”循环

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"]

for kiraСharacteristic from kiraСharacteristicsArray

    setTimeout (->
        console.log "Kira is #{kiraСharacteristic}!"
    ), 0

编译的JavaScript:

var kiraСharacteristicsArray, kiraСharacteristic;

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"];

for (kiraСharacteristic of kiraСharacteristicsArray) {
  setTimeout((function() {
    return console.log(`Kira is ${kiraСharacteristic}!`);
  }), 0);
}

结果:

Kira is Perfection!
Kira is Perfection!
Kira is Perfection!

简单的 ECMAScript 解决方案在 CoffeeScript 中不起作用:

  1. CoffeeScript 还没有
    const
    let
  2. 不幸的是,CoffeeScript 仅编译为
    var
    ,而不是
    const
    let
  3. 我还没有找到 ESLint 插件 或任何其他工具可以在 JavaScript 文件中正确地将
    var
    替换为
    const
    let

3.2。关闭

正如@Alex Wayne 在他的回答中所描述的那样:

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"]

for kiraСharacteristic from kiraСharacteristicsArray

    do(kiraСharacteristic) ->

        setTimeout (->
            console.log "Kira is #{kiraСharacteristic}!"
        ), 0

编译的JavaScript:

var kiraСharacteristicsArray, kiraСharacteristic;

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"];

for (kiraСharacteristic of kiraСharacteristicsArray) {
  (function(kiraСharacteristic) {
    return setTimeout((function() {
      return console.log(`Kira is ${kiraСharacteristic}!`);
    }), 0);
  })(kiraСharacteristic);
}

我得到了预期的控制台输出,但 ESLint 返回

no-shadow
错误:

6:13 错误“kiraСcharacteristic”已在第 1 行第 16 列无阴影的上部范围中声明

3.3。 “forEach()”方法

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"]

kiraСharacteristicsArray.forEach (kiraСharacteristic) ->

    setTimeout (->
        console.log "Kira #{kiraСharacteristic}!"
    ), 0
    

编译的JavaScript:

var kiraСharacteristicsArray;

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"];

kiraСharacteristicsArray.forEach(function(kiraСharacteristic) {
  return setTimeout((function() {
    return console.log(`Kira ${kiraСharacteristic}!`);
  }), 0);
});

我得到了预期的控制台输出,但是Unicorn返回

no-array-for-each
错误

5:11 错误 使用

for…of
而不是
.forEach(…)
unicorn/no-array-for-each

3.4。 “继续”声明

我修复了上面的 JavaScript 使用 ESLint、Unicorn 和

prefer-arrow-function
插件 使用
eslint --fix
CLI 命令:

var kiraСharacteristicsArray;

kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"];

for (const kiraСharacteristic of kiraСharacteristicsArray) {
   setTimeout((() => console.log(`Kira ${kiraСharacteristic}!`)), 0); continue;
}

我得到了预期的控制台输出,但 ESLint 返回

no-continue
错误:

6:64 错误 意外使用 continue 语句 no-continue

4.不提供

请不要提供:

  1. “使用 JavaScirpt,CoffeeScript 不好”。

  2. “不要在循环内使用函数。请阅读 JSHint 的警告”。是的,当我在循环内使用函数时,JSHint 返回

    warning W083

    jshint:警告 W083 - 在引用外部作用域变量的循环内声明的函数可能会导致语义混乱。 (控制台)

    但在我看来,

    loopfunc
    JSHint 的选项已经过时,并且没有考虑 ECMAScript 功能
    const
    let

  3. “使用Civet而不是CoffeeScript”是的,我知道Civet支持

    const
    let
    ,请参阅我在Civet上写的MCVE。但我关于 CoffeeScript 的问题。

javascript for-loop foreach coffeescript closures
1个回答
0
投票
kiraСharacteristicsArray = ["Goddess", "Ideal", "Perfection"]

`for(const kiraСharacteristic of kiraСharacteristicsArray)
    setTimeout(() =>
        console.log("Kira is #{kiraСharacteristic}!")
    ), 0)
`
© www.soinside.com 2019 - 2024. All rights reserved.