我正在从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
行的重要性是什么?
答案 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);