f5 = (x) -> 500 + x
f6 = (x) -> 600 + x
f7 = (x) -> 700 + x
console.log (f5 5, f6 6, f7 7) # prints 505
console.log(f5 5, f6 6, f7 7) # prints 505
console.log f5 5, f6 6, f7 7 # prints 505
console.log(f5(5), f6(6), f7(7))
只有最后一次调用console.log
才能正常工作:打印505 606 707
。
但那是JavaScript风格(或者我应该提一下Lisp?),可以用CoffeeScript风格来实现吗?
答案 0 :(得分:3)
我可以看到两个问题的解决方案。
首先是使用括号:
console.log (f5 5), (f6 6), (f7 7)
第二个是将console.log
分成多行:
console.log (f5 5),
f6 6
f7 7
不幸的是,函数的第一个参数应该与函数本身在同一行。这意味着在你的例子中没有办法完全摆脱括号。
答案 1 :(得分:1)
这是您的代码转换为:
var f5, f6, f7;
f5 = function(x) {
return 500 + x;
};
f6 = function(x) {
return 600 + x;
};
f7 = function(x) {
return 700 + x;
};
console.log(f5(5, f6(6, f7(7)))); //505
console.log(f5(5, f6(6, f7(7)))); //505
console.log(f5(5, f6(6, f7(7)))); //505
console.log(f5(5), f6(6), f7(7)); //505, 606, 707
因此,在您的第一个 3 日志中,您调用的f5
只接受一个参数,因此忽略其余参数。
可以做的是:
console.log(
f5 5
f6 6
f7 7
)
多行强制它作为单独的函数运行
您可以对对象执行相同操作,将换行符添加逗号:
obj =
a: 42
b: 23
答案 2 :(得分:0)
中心问题是,一旦你给出它:
console.log f5 5 # compiles to console.log(f5(5));
如果没有f6(6)
,则无法向6
添加其他参数(例如console.log
甚至只是()
)。我尝试使用换行符,逗号和缩进的每一件事都会产生错误或产生
console.log(f5(5, f6(6)));
换句话说,你如何明确地告诉它f6 6
是console.log
而不是f5
的论据? Coffeescript不会分析这些函数来确定每个函数可以采用多少个参数。实际上在Javascript中,通过扩展Coffeescript,函数没有固定的签名。
除了询问编译器将处理什么之外,请问您清楚的是什么?如果你看到:
foo one two, three four
并且对这些变量一无所知,你会如何解释它?