1

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

@foo = (bar) ->

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

以下是有效的方法:

foo = (bar) ->

window.foo = foo

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

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

4

2 回答 2

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/

这是一个向您展示 CoffeeScript 及其生成代码的链接

于 2012-11-14T15:05:49.960 回答
0

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

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

因此,您的 foo 成为匿名包装函数的成员函数 - 无用的gg ...

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

于 2012-11-15T02:12:57.090 回答