2

this関数を呼び出すが、実行して関数を呼び出すときにコンテキストを「デフォルト」値に設定するメソッドはありますfn()か?

このメソッドは、apply()と同様に、配列を受け入れ、単一の要素を引数として関数に渡す必要があります。

emitter = new EventEmitter();
args = ['foo', 'bar'];

// This is the desired result:
emitter.emit('event', args[0], args[1], ...);

// I can do this using apply, but need to set the context right
emitter.emit.apply(emitter, 'event', args);

// How can I trim the context from this?
emitter.emit.???('event', args);

編集:これを明確にするために、呼び出された関数内にある値に注意します-グローバルオブジェクトなどではなく、this実行時に持つ「通常の」コンテキストである必要があります。emitter.emit()そうでなければ、これは時々物事を壊します。

4

3 に答える 3

5

null合格するかundefined、コンテキストを気にしない場合は合格できます。関数内では、非厳密モードの場合this はグローバルオブジェクトを参照し、厳密モードの場合はそれぞれを参照しますnullundefined

関数の「デフォルト」コンテキストを定義するのは難しい

function f() { return this };
a = { b: f }
c = a.b;

console.log(f());   # window
console.log(a.b()); # a
console.log(c());   # window

これらのどれが「正しい」コンテキストですか?

あなたの場合、効用関数を検討するかもしれません

/* you might call it something else */
emitter.emit_all = function (event, args) {
    return this.emit.apply(this, [event].concat(args));
}
于 2012-07-18T07:23:21.973 に答える
4

最初のパラメータをグローバルオブジェクトに設定するだけです(つまりwindow、ブラウザで)

ES3ブラウザーnullでは、代わりに渡すことができ、グローバルオブジェクトに自動的に変更されますが、その動作はES5仕様で削除されています。


編集それはあなたがただ新しい機能を必要としているように聞こえます:

EventEmitter.prototype.emitArgs = function(event, args) {
    this.emit.apply(this, [event].concat(args));
}

その時点であなたはただ呼び出すことができます:

emitter.emitArgs('event', args);

@Esalijaのおかげで編集[].concat

于 2012-07-18T07:23:03.917 に答える
0

これは、ネイティブ関数の「引数」変数によって解決されます。

var EventEmitter = window.EventEmitter = function(){
    //this.emit = this.emit.bind(this);//bind emit to "this"
    return this;
};
EventEmitter.prototype.isMe = function(obj){
    return obj === this;
};
EventEmitter.prototype.emit = function(eventName){
    var input = Array.prototype.slice.call(arguments, 1);
    console.log("this:%O, Emitting event:%s, with arguments:%O", this, eventName,input);
};

emitter = new EventEmitter();
emitter.emit('magicEvent', 'Zelda Con', 'Zork Meetup', 'etc');

「this」コンテキストを維持するには、コンストラクターでemitメソッドをバインドできますが、これにより、インスタンスごとに「独自の」オブジェクトプロパティが作成され、メモリ消費量が増加し、必要に応じて、オブジェクト作成時にすべてのプロトタイプチェーンルックアップ(バインドされたメソッドの場合)が実際に実行されます。それらかどうか。

于 2014-03-29T08:26:42.870 に答える