0

在我实例化我的类之后,我调用myClass.testScope(),它调用类中的另一个函数。但是,当我将函数作为参数传递时,我失去了作用域并调用testScopeFromPassedParam导致data1错误Uncaught TypeError: Object [object global] has no method 'testScopeFromPassedParam'

有人可以以最好的方式帮助解决这个问题吗?

http://jsfiddle.net/2sJVX/4/

class MyClass

  test: () ->

    @testScope()

  testScope: () ->

    console.log 'worky'

  testScopeFromPassedParam: () ->

    console.log 'no worky'

  data1: (cb) ->

    # Shoot. The error.
    @testScopeFromPassedParam()

    setTimeout (->
      cb '1'
    ), 1000

  data2: (cb) ->
    setTimeout (->
      cb '2'
    ), 3000

  loadData: () ->

    getDeferred = (someFunction) ->

      deferred = $.Deferred()

      someFunction (data) ->

        console.log data

        deferred.resolve()

      deferred

    dataFunctions = [
      @data1
      @data2
    ]

    arrayOfPromises = [ ]
    for someFunction in dataFunctions
      arrayOfPromises.push getDeferred(someFunction)

    $.when.apply(null, arrayOfPromises).done () =>
      alert 'returned'

myClass = new MyClass()
myClass.testScope()
myClass.loadData()
4

1 回答 1

1

这不是 [variable] 范围,而是这里丢失的this上下文。您需要将函数绑定到您的对象,在咖啡脚本中,您可以为此使用胖箭头语法

data1: (cb) =>
    @testScopeFromPassedParam()
    …

顺便说一句,您真的应该将 传递data给 resolve 函数(或者只使用somefunction deferred.resolve

于 2013-03-20T22:50:47.787 回答