2015-10-20 103 views
0

我是新來的咖啡標記,並有一個關於訪問函數的問題。Coffeescript訪問函數

鑑於以下代碼,我將如何從構造函數的for循環訪問checkType函數?

class ApplicationForm.Save 
    constructor: (@formItems) -> 
    @that = this 
    for item in @formItems 
     do -> 
     checkType(item) 

    checkType: (forItem) -> 
    console.log(@formItem.find("input").length) 
+1

你爲什麼這樣做'@that = this'? (轉換爲'this.that = this') – Mathletics

回答

1

似乎有此困惑的公平位:

  1. @that = this沒有任何意義。它看起來像你試圖複製的常見的JavaScript成語:

    var that = this; 
    

    ,這樣就可以使用所需的this別處。但@不用於聲明變量(CoffeeScript自動執行此操作),@只是this.的簡寫。你的意思是this.that = this,那沒什麼用處。

  2. do在需要立即評估循環變量而不是僅僅抓取引用時用於循環。常見的情況是這樣的:

    for i in [0, 1, 2] 
        $(".something#{i}").click -> console.log(i) 
    

    該代碼只會導致一切說2無論什麼被點擊,因爲所有的匿名回調使用相同的i參考。添加do僅包裝循環體在自調用函數強制循環變量解除引用所以這個:

    for i in [0, 1, 2] 
        do (i) -> 
        # do something with `i`... 
    

    是這樣的JavaScript:

    for(i = 0; i <= 2; ++i) 
        (function(i) { 
        // do something with `i`... 
        })(i) 
    

    你傳遞item的功能已經如此,do是多餘的。

  3. 您的checkType(item)正試圖調用一個不存在的函數。你似乎要撥打的checkType方法和要回什麼@是一回事,我們看到,你需要使用@調用該方法上this

    @checkType(item) 
    
  4. checkType方法具有forItem說法,但你在方法裏面使用@formItem。但是,@就是我們在CoffeeScript中如何說this,所以似乎存在拼寫錯誤(forItemformItem)的組合,以及有關@含義的一些混淆。你或許checkType應該是這樣的:

    checkType: (formItem) -> 
        console.log(formItem.find("input").length) 
    

把所有的一起給我們:

class ApplicationForm.Save 
    constructor: (@formItems) -> 
    for item in @formItems 
     @checkType(item) 
    checkType: (formItem) -> 
    console.log(formItem.find("input").length) 
0

您將需要使用脂肪箭頭=>在for循環,以保留this從構造函數的值:

for item in @formItems 
    do => 
    @checkType(item) 

你可以閱讀更多有關在脂肪箭頭語法CoffeeScript documentation