0

「this.text」を出力する次のコードについて質問があります。

それを機能させるには、ラッパー関数が必要です。これは面倒すぎる。

それを機能させるためのより簡単な方法(追加のラッパーなし)はありますか?

  function Class1() {
    this.text = "test";
  }

  Class1.prototype.show = function() {
    console.log(this);
    console.log(this.text);
  }

  var testClass = new Class1();

  function funWithCallBack(cb) {
    cb();
  }

  // it will show "undefined" because "this" scope changes to window
  funWithCallBack(testClass.show); 

  function wrapper() {
    testClass.show();
  }

  // this one will work but troublesome
  funWithCallBack(wrapper)
4

1 に答える 1

3

次のような無名関数を使用できます。

// it will show "undefined" because "this" scope changes to window
funWithCallBack(testClass.show); 

これに:

// anonymous function to use the right object for the method
funWithCallBack(function() {
    testClass.show()
}); 

コールバックとして渡すtestClass.showと、関数参照を取得するだけで、それtestClass以上の関連付けがないため、問題が発生します。ただし、を使用してそれらをバインドする一時関数を作成できますが .bind()、一部の古いブラウザーではサポートされていないため、通常は無名関数を使用します。

実装は次の.bind()ようになります。

// use .bind() to make sure the method is called in the right object context
funWithCallBack(testClass.show.bind(testClass)); 
于 2013-02-24T04:51:50.290 に答える