命名空间如何在coffeescript和rails中工作?

时间:2014-02-27 22:44:15

标签: javascript jquery ruby-on-rails coffeescript gitlab

我正在从Gitlab看这个coffeescript code并想知道它是如何工作的。

class Issue
  constructor: ->
    $('.edit-issue.inline-update input[type="submit"]').hide()
    $(".issue-box .inline-update").on "change", "select", ->
      $(this).submit()
    $(".issue-box .inline-update").on "change", "#issue_assignee_id", ->
      $(this).submit()

@Issue = Issue

似乎这只是在问题相关视图中使用,但在问题html中没有被调用。幕后有什么神奇的东西在这里吗?另外@Issue = Issue行的重要性是什么?

2 个答案:

答案 0 :(得分:1)

@Issue = Issue只是将局部变量发布到全局范围。这与红宝石或铁轨无关。这纯粹是一种咖啡文字成语。

CoffeeScript在包装器内执行,该包装器旨在防止在全局范围内创建变量。在这个包装器中,this(或@)是全局对象。

所以这个:

class Issue
  constructor: ->

@Issue = Issue;

大致编译到这个JS:

(function() {
  var Issue;

  Issue = (function() {
    function Issue() {}
    return Issue;
  })();

  this.Issue = Issue;
}.call(window));

在该JS中,window变为this,窗口属性成为全局变量。因此,从现在开始,您只需要在任何其他JS文件中键入Issue,您将拥有问题构造函数。

如果没有@Issue = Issue行,Issue构造函数将永远不会在该代码之外可用,并且没有其他文件可以使用它。


换句话说,它与此相同:

window.Issue = Issue;

我实际上大部分时间都喜欢这个。更清楚的是,window总是意味着window,但@可能意味着许多事情,具体取决于它出现的位置。

答案 1 :(得分:0)

就像在JavaScript中一样,coffeescript中没有正确的命名空间。 @Issue = Issue转换为this.Issue = Issue。我的猜测是这个片段在构建期间要与其他文件连接,其中一个打开一个匿名闭包,类似于下面的那个。

var namespace1 = {subnamespace1: {}};

(function() {
  // Several concatenated files
}).call(namespace1.subnamespace1);