关于splat&amp ;;的CoffeeScript好奇心这个实现

时间:2014-11-04 20:31:34

标签: javascript coffeescript

所以,通过一些功能性的&作为它的驱动程序。我看到这种splat使用的惯例,虽然我可以“看到”它在编译的javascript中做了什么,但我还没有看到任何提及这是文档等...在“。 ..“在行尾用于咖啡的splat用法(见下文)。

例如,我们有:

flip = (f) -> (as...) -> f as.reverse()...

编译为:

flip = function(f) {
  return function() {
    var as;
    as = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    return f.apply(null, as.reverse());
  };
};

现在,我知道“as ...”被用作:

as = 1 <= arguments.length ? __slice.call(arguments, 0) : [];

获取参数并将它们分配给“as”。

但是,我没有把头包裹起来就是这里的用法:

 -> f as.reverse()...  # <-- the "..." at the end. 

如果我删除它('...'),那么编译的“apply”就会消失。那么,最后使用“...”的惯例是什么。我在coffeescript知识中错过了这个概念。

1 个答案:

答案 0 :(得分:4)

...在行尾没什么特别的。

你在这里看到的是splat参数和splat参数之间的区别。 ...运算符用于两种情况,因为它们是相关的。但是,这可能会令人困惑,因为这些用途是彼此相反的。

as.reverse()...是传递给f的splat参数。已编译的JavaScript使用f.applyas.reverse()分解为接收方f的多个参数。

as...是一个splat参数。已编译的JavaScript使用__slicearguments对象转换为接收器内的数组,以将参数收集到单个列表中。