您不能直接调用 CoffeeScript 函数的原因是 CoffeeScript 在编译时被包装在一个立即调用的函数中。这样做是为了防止您的代码污染全局命名空间。
这通常是 A Good Idea™,但您当然可以在需要时绕过它。如果您希望一个函数或其他变量可以在任何地方(即全局范围)访问,您可以简单地说
window.myName = -> "Bob"
这样,函数会直接添加到全局作用域中,您可以在任何地方以window.myName() 的形式调用它(或简单地以myName() 的形式调用,除非该函数被本地函数遮蔽)。
然而,为了保持全局命名空间尽可能干净,最好为自己定义一个命名空间(就像 jQuery 所做的那样,将 everything 放入 $ 对象中)。例如,在您的第一个 CoffeeScript 或 JavaScript 文件(即要加载的第一个文件)中,您可以这样做
window.myNamespace = {};
然后,当您希望某些东西在其他地方可用时,您可以将其添加到该命名空间:
window.myNamespace.myName = -> "Bob"
然后您可以从任何地方调用它,使用window.myNamespace.myName() 或简单地使用myNamespace.myName()。
或者,您可以在所有文件的顶部使用 CoffeeScript 的“assign if undefined or null”运算符:
window.myNamespace ?= {} # create myNamespace if it doesn't already exist
首先评估哪个文件将创建缺少的window.myNamespace 对象。后续代码只会看到它已经存在并跳过分配。重点是,无论评估顺序如何,它始终可用。
编辑:将myNamespace 设为小写,因为它基本上是一个变量;不是构造函数/类
附录:您可以通过使用-b/--bare 命令行开关来避免使用函数包装器,但如上所述,包装器是个好东西。