请考虑以下情况:您无法直接访问for循环的数组,例如
for x, y in [1,2,3]
console.log x, y, [1,2,3].length
其中需要再次键入数组[1,2,3]以访问其长度。 这编译成:
var x, y, _i, _len, _ref;
_ref = [1, 2, 3];
for (y = _i = 0, _len = _ref.length; _i < _len; y = ++_i) {
x = _ref[y];
console.log(x, y, [1, 2, 3].length);
}
我们看到变量_ref
已定义。
_ref
就我而言可以在CoffeeScript中使用:
for x, y in [1,2,3]
console.log x, y, _ref.length
工作正常,编译没有任何问题。
我可以看到这种方法可能会在以下情况下出现问题:
for x, y in [1,2,3,4,5,6]
continue
for x, y in [1,2,3]
console.log x, y, _ref.length
其中第二个循环中的_ref
是第一个数组[1,2,3,4,5,6]
,而数组[1,2,3]
设置为未使用的变量_ref1
那么,有没有办法以一种很好的方式解决这个问题,(明显的是将变量定义为[1,2,3]
)?
答案 0 :(得分:3)
要解决您在不首先将变量放入变量时引用数组的潜在愿望,您可以使用Array#forEach
(或其他各种变体,如some
,every
等。 )。他们接收数组引用作为第三个参数:
[1, 2, 3].forEach (e, i, a) ->
console.log e, i, a
e
=此次迭代的数组中的条目
i
=此迭代的索引
a
=数组引用
不要担心函数调用的运行时成本it's near enough to zero that it doesn't matter。请注意this
在回调中具有不同的含义(除非您将thisArg
参数传递给forEach
)。我不知道CoffeeScript是否为您提供语法糖,使其成为非问题(我不使用CoffeeScript)......