将函数作为参数传递的范围问题

时间:2013-03-20 22:20:17

标签: javascript coffeescript

在我实例化我的课程之后,我调用了myClass.testScope(),它调用了类中的另一个函数。但是,当我将该函数作为参数传递时,我失去了范围并从testScopeFromPassedParam调用data1会导致错误 未捕获TypeError:对象[object global]没有方法&# 39; 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()

1 个答案:

答案 0 :(得分:1)

那不是[变量]范围,这是this context在这里丢失的。您需要将函数绑定到您的对象,在coffeescript中,您可以使用fat-arrow syntax

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

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