循环从给定的索引开始

时间:2014-03-29 19:30:50

标签: coffeescript

考虑到以下javascript,如果初始索引大于0,在咖啡脚本中编写此循环的最佳方法是什么:

function mixin(target, source, methods) {
  for (var i = 2, l = arguments.length; i < l; i++){
    var method = arguments[i];
    target[method] = source[method].bind(source)
  }
}

自动代码转换器建议使用while循环,如下所示:

mixin = (target, source, methods) ->
  i = 2
  l = arguments.length

while i < l
  method = arguments[i]
  target[method] = source[method].bind(source)
  i++

有更简洁的方法吗?

2 个答案:

答案 0 :(得分:3)

使用exclusive range(三点,排除最高数字。

for i in [2...arguments.length]
  method = arguments[i]
  target[method] = source[method].bind(source)

如果你的args中有5件事,这将会触及索引2,3和4.

答案 1 :(得分:3)

在定义mixing函数时,您通常会在CoffeeScript中使用splat

  

JavaScript arguments对象是一种处理接受可变数量参数的函数的有用方法。 CoffeeScript提供splats ...,用于函数定义和调用,使可变数量的参数更加可口。

所以你要说:

mixin = (target, source, methods...) ->
  # splat ----------------------^^^
  for method in methods
    target[method] = source[method].bind(source)

你的问题就消失了。参数列表中的splat会将source之后的所有参数收集到methods数组中,这样您就不必担心arguments; splat也使函数的签名很好而且很明显。