为什么Rails 3.1/Sprocket 2/CoffeeScript添加了额外的代码?

为什么Rails 3.1/Sprocket 2/CoffeeScript添加了额外的代码?,coffeescript,ruby-on-rails-3.1,sprockets,Coffeescript,Ruby On Rails 3.1,Sprockets,在使用Rails 3.1(rc5)时,我注意到我包含Rails(或链轮)的任何coffeescript文件都在顶部和底部添加初始化javascript。换句话说,将输出一个空白的.js.coffee文件,如下所示: (function() { }).call(this); 这让人恼火,因为它破坏了我的javascript范围(除非我真的不知道自己在做什么)。我通常将我的所有javascript类分离到单独的文件中,我认为让函数代码包装我的类只会使它们彼此超出范围。或者,至少,我似乎无法访问它们

在使用Rails 3.1(rc5)时,我注意到我包含Rails(或链轮)的任何coffeescript文件都在顶部和底部添加初始化javascript。换句话说,将输出一个空白的.js.coffee文件,如下所示:

(function() {
}).call(this);
这让人恼火,因为它破坏了我的javascript范围(除非我真的不知道自己在做什么)。我通常将我的所有javascript类分离到单独的文件中,我认为让函数代码包装我的类只会使它们彼此超出范围。或者,至少,我似乎无法访问它们,因为我不断地遇到未定义的错误

有没有办法克服这个问题?链轮中的此文件似乎与添加以下代码有关:


我明白,将所有内容包装到函数中似乎是一种额外的便利,因为在加载DOM之前不会运行任何内容,但据我所知,这只是弄乱了我的作用域。

您打算将对象放入全局作用域吗?我认为CoffeeScript通常将代码封装在匿名函数中,这样它就不会意外地将变量泄漏到全局范围中。如果没有办法将其关闭,您最好的选择可能是将您希望位于全局范围内的任何内容专门添加到窗口对象:

window.myGlobal = myGlobal;

如今,将代码放在函数范围内并明确地将对象添加到全局范围似乎是javascript的最佳实践,我通常看到CoffeeScript会自动这样做。

您不想将所有内容都放在全局范围内。您需要一个模块或类似模块的系统,在这个系统中,您可以为事物命名名称空间,这样就不会与其他库合并。读一读


是的,我现在开始明白了。谢谢,我正在努力将一切都纳入全球范围。这两个问题很相似:请看: