函数声明的coffeescript宏

时间:2013-07-04 19:47:18

标签: javascript function macros coffeescript hoisting

Coffeescript中的函数不能被提升,因为它不起作用声明,只起作用函数表达式。如何编写宏来向coffeescript添加函数声明?

具体来说,我想:

foo(bar, baz) ->

编译为:

function foo(bar, baz) {
}

而不是:

foo(bar, baz)(function() {});

2 个答案:

答案 0 :(得分:0)

除非您想在JavaScript中编写foo并使用反引号将其嵌入到CoffeeScript中,否则我认为您无法做到这一点。例如:

console.log f 'x'
`function f(x) { return x }`

成为这个JavaScript:

console.log(f('x'));
function f(x) { return x };

f将根据需要执行。

如果你想改变CoffeeScript解释foo(bar, baz) ->的方式,那么你将不得不编辑解析器并处理所有副作用和破坏的代码。结果将类似于CoffeeScript,但它不会是CoffeeScript。

CoffeeScript和JavaScript是不同的语言,尝试编写CoffeeScript而你在用JavaScript术语思考时会弄得一团糟;他们分享了很多,CoffeeScript被编译/翻译成JavaScript,但它们不是同一种语言,所以你用不同的方式处理它们。不要用C ++编写C代码,不要在Scala中编写Java,不要在CoffeeScript中编写JavaScript,...

答案 1 :(得分:-1)

我真的不确定你想要完成什么,但最接近你想要的是这个

func = (name) ->
    (body) ->
        window[name] = body

func("foo") (arg)-> console.log(arg)

foo("lala") #prints lala

我还建议继续使用CoffeeScript语法“宏”,纠正这样一个重要的事情,如函数声明必然会造成混淆。特别是因为你没有赢得任何东西 - 恰恰相反。