您无法直接调用CoffeeScript函数的原因是CoffeeScript在编译时被包装在立即调用的函数中。这样做是为了防止代码污染全局名称空间。
这通常是一个好主意™,但当然您可以在需要的时候避开它。如果你想有一个函数或其他变量进行访问到处(全球范围),你可以简单地说
window.myName = -> "Bob"
这样一来,该功能直接加入到全球范围内,你可以从叫它任何地方都可以为window.myName()
(或简单地作为myName()
,除非函数被本地镜像遮蔽)。
然而,保持全局命名空间尽可能干净,最好定义一个命名空间为自己(如jQuery做,通过把一切到$
对象)。例如,(即要加载的第一个文件)你的第一个的CoffeeScript或JavaScript文件,你可以做这样的事情
window.myNamespace = {};
然后,只要你想要的东西是其他地方,你可以将其添加到命名空间:
window.myNamespace.myName = -> "Bob"
然后你就可以在任何地方调用它,使用window.myNamespace.myName()
或者干脆myNamespace.myName()
。
或者,你可以使用CoffeeScript中的所有文件顶部的“分配,如果未定义或为空”操作符:
window.myNamespace ?= {} # create myNamespace if it doesn't already exist
无论文件被首先评估将创建缺少window.myNamespace
对象。随后的代码将会看到它已经存在并跳过了这个任务。要点是,无论评估顺序如何,它总是可用的。
编辑:制造myNamespace
下驼峰,因为它基本上是一个变量;不是构造函数/类
附录:您可以通过使用-b/--bare
命令行开关避免了功能的包装,但提到的包装是一件好事。
你应该真的接受Flambino的答案。这很棒! – 2014-04-09 12:37:28