2014-02-27 70 views
0

我正在看這個來自Gitlab的咖啡腳本code,並想知道它是如何工作的。命名空間如何在coffeescript和rails中工作?

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系列的重要性如何?

回答

1

@Issue = Issue只是將局部變量發佈到全局範圍。這與Ruby或Rails沒有任何關係。這完全是一個咖啡劇本成語。

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,但@可能意味着很多事情,具體取決於它出現的位置。

+0

順便說一句,有編譯器開關禁用自動換行。 – sabof

+0

@sabof有。但你真的不應該使用它。包裝的好處遠遠超過了煩惱。 –

+0

你是對的95%的時間。 – sabof

0

就像在JavaScript中一樣,coffeescript中沒有適當的命名空間。 @Issue = Issue轉換爲this.Issue = Issue。我的猜測是,這段代碼是爲了在構建過程中與其他文件連接起來,其中一個打開一個匿名閉包,類似於下面的代碼。

var namespace1 = {subnamespace1: {}}; 

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