【问题标题】:Some kind of _ref usage in coffeescript?咖啡脚本中的某种 _ref 用法?
【发布时间】: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())

标签: javascript coffeescript


【解决方案1】:

为了解决您在不首先将其放入变量的情况下引用数组的潜在愿望,您可以使用Array#forEach(或其他各种,如someevery等)。他们接收数组引用作为他们的第三个参数:

[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)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多