6

ブラウザが「これ」と見なすものに問題があります。次の例では、abcでpingMe()を呼び出すと1秒間待機し、ブラウザはオブジェクトDOMWindowにメソッド'func'がないと表示します。'this'をクラスABC(abc)のインスタンスに解決する代わりに、オブジェクトが関与していないかのように、代わりにDOMWindowに解決します。コールバックスコープに関してsetTimeoutがどのように機能するかをはっきりと理解していません。このコールバックを成功させる方法についての提案はありますか?

class ABC
  @func = null

  constructor: (func) ->
    @func = func

  pingMe: ->
    setTimeout(doPing, 1000)

  doPing = ->
    @func()

abc = new ABC ->
  alert "HI"
abc.pingMe()
4

3 に答える 3

10

このコードが機能しました。

class ABC
  @func = null

  constructor: (func) ->
    @func = func

  pingMe: ->
    setTimeout =>
     @doPing()
    , 1000

  doPing: ->
    @func()

abc = new ABC ->
  alert "HI"
abc.pingMe()

あなたの doPing メソッドは defined でしdoPing = ->たが、他の人はすべて を使用していますがname: ->、私はそのように変更しました。名前のない関数を作成し、関数にバインドするためにpingMe使用します。=>@doPingthis

これが正しいかどうかはわかりませんが、私は JavaScript をほとんど使用していません。しかし、それがあなたにさらに先を見据える方向性を与えてくれることを願っています。

于 2011-02-07T02:27:33.550 に答える
1

ES5で行うことに近い代替ソリューションは次のとおりです。

pingMe: ->
    setTimeout(@doPing.bind(@), 1000)

または括弧を節約したい場合:

pingMe: ->
    setTimeout (@doPing.bind @), 1000

これbindは ES5 であるため、バージョン 9 以降の IE でのみ使用できます。


また、試してみたいという誘惑は絶対に避けてください。

    setTimeout(@doPing.bind @, 1000)    # BAD!
       or
    setTimeout @doPing.bind @, 1000     # BAD!

どちらも!bindではなくの 2 番目の引数として数値を渡すためです。setTimeout

于 2014-06-20T07:59:23.797 に答える
0

おそらくもう少し明確にするために、代わりに「doPing」メソッドをバインドすることができます。少しすっきりしてFWIWに見えますが、達成しようとしていることをよりよく表現していると思います。

class ABC
  @func = null

  constructor: (func) ->
    @func = func

  pingMe: ->
    setTimeout => @doPing, 1000

  doPing: =>
    @func()

abc = new ABC ->
  alert "HI"
abc.pingMe()
于 2012-02-03T15:07:47.070 に答える