Rails 3.2.8。在将我的一些JS函数转换为CoffeeScript时,我遇到了几个问题,即声明这样的函数:
@foo = (bar) ->
将foo
放入全局命名空间。但事实并非如此,因为我的函数调用应用程序中的其他位置,尤其是.js.erb
文件中的函数。
这是有用的:
foo = (bar) ->
window.foo = foo
这样,.js.erb
文件中的所有调用都可以正常工作。
@foo =
符号无法正常工作的原因是什么?这比记住添加额外的行以将函数暴露给全局命名空间要容易得多。
答案 0 :(得分:4)
@foo
转换为this.foo
foo
转换为var foo
这两者之间存在很大差异。
例如:
bar = (baz) ->
@bar = 5
lemon = @bar + baz
@foo = (bar) ->
lemon
return @
Bar = new bar(12)
转换为:
var Bar, bar;
bar = function(baz) {
var lemon;
this.bar = 5;
lemon = this.bar + baz;
this.foo = function(bar) {
return lemon;
};
return this;
};
Bar = new bar(12);
请参阅生成代码的小提琴演示:http://jsfiddle.net/maniator/rXWw2/
Here is a link showing you the CoffeeScript and it's generated code
答案 1 :(得分:0)
我只想添加一些对于理解为什么是最初的重要内容 @foo =() - > “ABC” 不会添加到全局窗口对象。
Coffeescript wrap - 一旦编译完成,它会将每个.coffee文件的所有内容包装到一个立即执行的周围匿名函数中。 因此,并且由于这个原因而明确地说,全局命名空间没有被污染,从而暗示保护开发者不会创建“邪恶的”全局。
所以,你的foo成为匿名包装函数的成员函数 - 严重无用 gg ......
我想你想要的是你的全局配置对象或其他东西,你只需添加你的定义---你肯定不是真的想创建全局变量,只是为了快速方便地访问,你呢? :)