Coffeescript访问功能

时间:2015-10-20 18:16:42

标签: javascript loops coffeescript

我是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)

2 个答案:

答案 0 :(得分:1)

这里似乎有一点混乱:

  1. @that = this没有任何意义。您似乎正在尝试重现以下常见的JavaScript惯用语:

    var that = this;
    

    这样您就可以在其他地方使用所需的this。但@并非用于声明变量(CoffeeScript会自动执行此操作),@只是this.的简写。您说this.that = this并没有任何用处。

  2. 当你需要立即评估循环变量而不是仅仅抓取引用时,
  3. 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是多余的。

  4. 您的checkType(item)正试图调用一个不存在的函数。您似乎想要调用checkType方法并回到@的全部内容,我们发现您需要使用@this上调用该方法:

    @checkType(item)
    
  5. 您的checkType方法有一个forItem参数,但您在方法中使用@formItem。但同样,@就是我们在CoffeeScript中说this的方式,因此似乎有一个拼写错误(forItemformItem)的组合以及对{@的一些混淆1}}意思是您的checkType可能应该是这样的:

    checkType: (formItem) ->
      console.log(formItem.find("input").length)
    
  6. 把所有这些放在一起给了我们:

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

答案 1 :(得分:0)

您需要在for循环中使用胖箭头=>,以便从构造函数中保留this的值:

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

您可以在CoffeeScript documentation中了解有关胖箭头语法的更多信息。

相关问题