2

これは主観的なものです (意見に基づく) - ただし、ある程度のことですので、急いで投票を締め切らないでください。誰もが異なる意見を持っており、人々はそれを行うための単一の方法を強制しようとしているため、職場でいくつかの議論を引き起こします.

単純なコンテキスト: インスタンスへのクロージャーで参照を保存するオプションがある場合、または polyfilled を使用するオプションがある場合、Function.prototype.bindどちらのアプローチにもどのような欠点があると思いますか?

考えられるユースケースを説明するために、いくつかのクラス メソッドを作成しました。

パターン 1、保存された参照:

obj.prototype.addEvents = function(){
    var self = this;

    // reference can be local also - for unbinding. 
    this.onElementClick = function(){
        self.emit('clicked');
        self.element.off('click', self.onElementClick);
    };

    this.element.on('click', this.onElementClick);
};

パターン 2、単純な fn.bind:

obj.prototype.addEvents = function(){
    // saved reference needs to be bound to this to be unbound
    // once again, this can be a local var also.  
    this.onElementClick = function(){
        this.emit('clicked');
        this.element.off('click', this.onElementClick);
    }.bind(this);

    this.element.on('click', this.onElementClick);
};

パターン 2.5、proto メソッドからイベントへ:

obj.prototype.addEvents = function(){
    // delegate event to a class method elsewhere 
    this.element.on('click', this.onElementClick.bind(this));
};

obj.prototype.onElementClick = function(){
    this.emit('clicked');
    this.element.off('click', this.onElementClick); // not matching due to memoized bound 
};

個人的には、これを行う正しい方法は 1 つではなく、ケースごとに判断する必要があるという意見です。可能な場合は、保存された参照パターンが非常に気に入っています。私は言われています。

質問の要約:

考慮/注意すべき GC の問題はありますか?

いずれかの方法で他に考えられる明らかな欠点や落とし穴はありますか?

ポリフィル パフォーマンスまたはイベント ネイティブ.bindvs 保存された参照?

4

2 に答える 2

1

考慮/注意すべき GC の問題はありますか?

古いエンジンは、クロージャーからまだ使用されている変数を推測せず、スコープ全体を保持します。bindコンテキストが明示的に渡され、収集されていないスコープに追加の変数が含まれていないため、使用すると簡単になります。

ただし、とにかく関数式を使用している場合 (パターン #1 および #2 のように)、これは違いはありません。

いずれかの方法で他に考えられる明らかな欠点や落とし穴はありますか?

参照の保存:

  • 変数を宣言するために追加の行が必要で、場合によってはまったく新しいスコープ (IEFE) が必要です。
  • 変数の名前を変更する必要があるため、コードを簡単に移動できません

バインドの使用:

  • 関数式の最後で見落とされがち (IEFE の呼び出しと同様)、this上から下に読むと何を参照しているのかが明確でない
  • 忘れやすい

私は個人的には簡潔さのために bind を使用する傾向がありますが、他の場所で宣言された関数 (メソッド) でのみ使用します。

ポリフィル パフォーマンスまたはイベント ネイティブ .bind と保存された参照?

あなたは気にしません。


あなたの例では、バインドされた関数とoffメソッドへの参照は実際には必要ありません。jQueryはそれ自体を処理できます。oneメソッドを使用して、 1回限りのリスナーをバインドできます。次に、コードを次のように短縮できます

obj.prototype.addEvents = function(){
    this.element.one('click', this.emit.bind(this, 'clicked'));
};
于 2013-10-25T12:21:24.163 に答える
1

私の個人的な好みは、保存された参照方法を使用することです。JavaScriptthisthis.

バインドは素晴らしいですが、見逃す.bind(this)とバグのように見えます。

後者は露出が多すぎます。コールバックが必要になるたびに、API で別のヘルパーを公開する必要があります。


プロトタイピングを使用する方法はたくさんあります。どれかを選んで継続することが一番大事だと思います。

于 2013-10-25T11:16:47.543 に答える