CoffeeScript中的@function不像宣传的那样工作

时间:2012-11-14 15:03:29

标签: coffeescript ruby-on-rails-3.2

Rails 3.2.8。在将我的一些JS函数转换为CoffeeScript时,我遇到了几个问题,即声明这样的函数:

@foo = (bar) ->

foo放入全局命名空间。但事实并非如此,因为我的函数调用应用程序中的其他位置,尤其是.js.erb文件中的函数。

这是有用的:

foo = (bar) ->

window.foo = foo

这样,.js.erb文件中的所有调用都可以正常工作。

@foo =符号无法正常工作的原因是什么?这比记住添加额外的行以将函数暴露给全局命名空间要容易得多。

2 个答案:

答案 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 ......

我想你想要的是你的全局配置对象或其他东西,你只需添加你的定义---你肯定不是真的想创建全局变量,只是为了快速方便地访问,你呢? :)