【发布时间】:2012-07-20 21:53:56
【问题描述】:
我不知道如何传递带参数的匿名函数。这是我的情况:
class MyClass
constructor: (@a) ->
console.log("MyClass: created " + @a)
show: ->
console.log("MyClass: show " + @a)
然后,使用 UnderscoreJS,这行得通:
_.map listOfMyClassObjects, (obj) -> obj.show
但为了方便起见,我想将对 map 的调用包装在一个单独的函数中:
allMyClass(fun) ->
_.map listOfMyClassObjects, fun(obj)
这样我以后可以做:
allMyClass((obj) -> obj.show())
但浏览器控制台显示:
Uncaught ReferenceError: fun is not defined
(anonymous function)
require../browser.CoffeeScript.run
...
什么是正确的合成器?另外,能不能这样简化?
allMyClass(fun) ->
_.map listOfMyClassObjects, obj[fun]()
allMyClass(show())
更新:
根据 Thilo 的回答,函数调用中存在语法错误。而且,在 map 迭代结果上调用函数时出错。工作版本是这样的:
allMyClass = (fun) ->
_.map listOfMyClassObjects, (obj) -> fun(obj)
如果有将类方法传递给allMyClass 函数的更短版本,仍然会徘徊。
更新 2:
可以这样简化:
allMyClass = (fun) ->
_.map listOfMyclassObjects, (obj) -> obj[fun]()
allMyClass("show")
将参数传递给fun 将需要传递更多参数。
【问题讨论】:
-
在 CoffeeScript 中,类主体本身是一个函数表达式,它被执行并返回实际的类构造函数。所以
foo = 1在类主体函数表达式本身的范围内设置了一个变量。而foo: 1在类原型上设置了一个值为1的foo属性。