【发布时间】:2014-10-18 01:14:38
【问题描述】:
考虑以下情况:您无法直接访问 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] 很明显)?
【问题讨论】:
-
“那么,有什么方法可以很好地解决这个问题” 什么问题?不要直接使用
_ref。没问题。 :-) 虽然_ref可能存在于CoffeeScript 编译器的输出中现在,但不能保证在下一个版本中它不会是_r或_reference。依赖内部结构只是一个坏主意(tm)。 -
@T.J.Crowder 在我的例子中,我从两个嵌套函数调用中接收到数组,我不想再次调用这些函数来访问数组的长度,当然我可以只存储变量中的数组,但就像在 for 循环中创建的变量 x,y 一样(在示例中),如果有某种方式可以访问数组而不必单独定义它,那就太好了。所以问题是我很懒,想要数组而不将其定义为外部变量。你所说的关于内部的使用似乎是明智的:)
-
:-) 他们没有给你
for x, y, a in [1, 2, 3]或其他东西(a将是对数组的引用),JavaScript 的内置方式forEach等真的太糟糕了做([1, 2, 3].forEach(function(entry, index, array) { ... }))。由于第二个,当前是无效语法,您可能会建议他们在未来的版本中使用它。在那之前,是的,一个变量可能是你最好的选择。 :-) -
@T.J.Crowder 哦! dam :D,使用 forEach 函数对我来说是一个完美的解决方案!
-
如果您想坚持使用循环并且对赋值表达式没有教条问题,您也可以
for e, i in (a = f())。