关于 ruby?? on rails 3.2:CoffeeScript 中的@function 不像宣传的那样工作

@function in CoffeeScript does not work as advertised

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

1
@foo = (bar) ->

foo 放在全局命名空间中。但它没有,因为我的函数调用了应用程序的其他地方,尤其是 .js.erb 文件中的函数。

以下是有效的方法:

1
2
3
foo = (bar) ->

window.foo = foo

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

@foo = 符号不能像我预期的那样工作的原因是什么?这比必须记住添加额外的行以将函数公开给全局命名空间要容易得多。


@foo 转换为 this.foo

foo 转换为 var foo

这两者之间有很大的不同。

例如:

1
2
3
4
5
6
7
8
9
bar = (baz) ->
 @bar = 5
 lemon = @bar + baz

 @foo = (bar) ->
  lemon
 return @

Bar = new bar(12)

翻译为:

1
2
3
4
5
6
7
8
9
10
11
12
13
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/

这是一个显示 CoffeeScript 及其生成代码的链接


我只是想添加一些对理解为什么最初很重要的东西
@foo = () -> "abc"
不添加到全局窗口对象。

Coffeescript wraps - 一旦编译,它将每个 .coffee 文件的所有内容package到一个立即执行的周围匿名函数中。
因此,明确地出于这个原因,全局命名空间没有被污染,从而隐含地保护开发人员不创建"邪恶"全局变量。

因此,您的 foo 成为匿名package函数的成员函数 - gg 多么无用...

我想无论如何你想要的是你的全局配置对象或其他东西,你只需添加你的定义 --- 你肯定不是为了现在快速和轻松地访问而真正创建全局变量,是吗? :)