0

クラスをインスタンス化した後、を呼び出しますmyClass.testScope()。これは、クラス内の別の関数を呼び出します。しかし、関数をパラメーターとして渡すと、スコープが失われ、結果testScopeFromPassedParamから呼び出すとdata1、エラーUncaught TypeError:Object[objectglobal]にメソッド'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

それは[変数]スコープではなく、ここで失われるthisコンテキストです。関数をオブジェクトにバインドする必要があります。coffeescriptでは、次のようにfat-arrow構文を使用できます。

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

ところで、あなたは本当に解決機能に渡す必要がありdataます(または単に使用するsomefunction deferred.resolve

于 2013-03-20T22:50:47.787 に答える