2015-10-20 77 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