我正在使用 Rails 3.1 和 CoffeeScript,但遇到了障碍。如何从位于 .js.coffee 文件中的 .js.erb 文件调用函数?
假设 .js.coffee 中的函数如下:
myName = -> "Bob"
我想我可以像任何常规 js 函数一样调用它,例如:
var theName = myName();
但这似乎不起作用。有什么想法吗?
或者是否可以在我的 .js.erb 文件中使用 Coffeescript 使所有内容都相同?
最佳答案
无法直接调用 CoffeeScript 函数的原因是 CoffeeScript 在编译时被包装在立即调用的函数中。这样做是为了防止您的代码污染全局命名空间。
这通常是一个好主意™,但当然您可以在需要时绕过它。如果您希望函数或其他变量可以在任何地方(即全局范围)访问,您可以简单地说
window.myName = -> "Bob"
这样,该函数将直接添加到全局作用域,您可以从任何地方以 window.myName()
形式调用它(或简单地以 myName()
形式调用)除非该函数被本地函数遮蔽)。
但是,为了保持全局命名空间尽可能干净,最好为自己定义一个命名空间(就像 jQuery 那样,将所有内容放入$
对象中) 。例如,在您的第一个 CoffeeScript 或 JavaScript 文件(即要加载的第一个文件)中,您可以执行以下操作
window.myNamespace = {};
然后,每当您希望某些内容在其他地方可用时,您可以将其添加到该命名空间:
window.myNamespace.myName = -> "Bob"
然后您可以使用 window.myNamespace.myName()
或简单地 myNamespace.myName()
从任何地方调用它。
或者,您可以在所有文件的顶部使用 CoffeeScript 的“如果未定义或 null 则赋值”运算符:
window.myNamespace ?= {} # create myNamespace if it doesn't already exist
无论哪个文件首先被评估,都会创建缺少的 window.myNamespace
对象。后续代码只会看到它已经存在并跳过分配。要点是,无论评估顺序如何,它始终可用。
编辑:将 myNamespace
改为小驼峰式,因为它基本上是一个变量;不是构造函数/类
附录:您可以使用 -b/--bare
命令行开关来避免使用函数包装器,但正如前面提到的,包装器是一件好事。 p>
关于javascript - Rails - 从 JavaScript 调用 CoffeeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254253/