3

「これ」について勉強してきたにもかかわらず、私が遭遇したこのコーディング パターンには少し困惑しています。次の (簡略化された) コードは、パターンを示しています。

var MyConstructor = function MyConstructor() {
    this._handlers = {
        action: this.handleAction.bind(this)
    };
};

MyConstructor.prototype.start = function(someObj) {
    this.someObj.on(’some event’, this._handlers.action);  //<--here
}

MyConstructor.prototype.handleAction = function() {
    //do stuff
}

module.exports = MyConstructor;

私の質問は、なぜコンストラクターのプライベート メソッドが必要なのですか? このパターンは、いくつかの一般的な問題を回避していますか? コメントされた行は次の//<--hereようになります:

this.someObj.on(’some event’, this.handleAction);
4

2 に答える 2

3

いいえ、違います。違いはcontextthisにあります。これは、関数内の値を意味します。

this.handleActiononコンテキストなしで関数を渡します。指定の値がありませんthis。関数の実行時に値が決定されます。値がaオブジェクトではない可能性が非常に高いため、たとえば、 は正しいオブジェクトを参照しないか、実際にはオブジェクトをまったく参照しません。MyConstructorthis.start

解決策はbind文脈にあります。これにより、コンテキストが永久に設定thisされるため、常に正しい値が参照されます。次のコード行が表示されます。

action: this.handleAction.bind(this)

これは、コードが後で を参照するときに、適切なコンテキストでthis._handlers.action関数を に送信するため、常に正しい値を指すことを意味します。onthis

于 2013-11-13T09:26:38.810 に答える
2

次の行の違い

this.someObj.on(’some event’, this.handleAction.bind(this));
this.someObj.on(’some event’, this.handleAction);

... 最初の handleAction はこれが MyConstructor のインスタンスで実行され、2 番目はイベント処理メカニズムが決定するコンテキストで実行されます。このような場合、これがグローバル オブジェクトで実行されます。

function on (a, callback) {
  callback(); // callback is run with this as the global object 
              // UNLESS it was bound to something else
}

「プライベート」_handlers プロパティは、インスタンスにバインドされたコールバックへの参照を保持する単なるオブジェクトです。bind を 2 回呼び出すと、2 つの関数が作成されます。_handlers プロパティにより、任意の数のイベントのハンドラーとして使用できる単一のバインドされた関数が作成されます。

于 2013-11-13T09:26:55.560 に答える