コールバック サブスクリプションを介して独自のライブラリにイベントを発行させる必要が頻繁にありました。場合によっては、サードパーティ ライブラリや DOM を使用してイベントを管理するのではなく、Javascript 関数変数を直接使用することを好みます。2 つの戦略を見つけましたが、どちらがより適切かわかりません。
これらの戦略は、この JSFiddle で示されています: http://jsfiddle.net/Q8pQT/2/
最初の戦略は、各サブスクリプションを関数配列に追加することです。これにより、イベントを呼び出す準備ができたら、イベント内のすべてのコールバックを反復処理できます。
var fnactionidx = 0;
var fnarr = [];
function add2fnArray() {
fnarr.push(fnaction);
console.log("added to array", fnarr.length);
}
function fnaction() {
console.log("Hi.", ++fnactionidx);
}
function arraygo() {
// do internal stuff here first
fnactionidx = 0;
for (var i=0; i<fnarr.length; i++) {
fnarr[i]();
}
console.log("array complete!")
// do internal stuff here last
}
この例でのサブスクライブは、単純な Array.push(fn) で行われます。
2 番目の戦略は、初期関数を定義してから、サブスクライバーごとにそれを含む関数でラップすることです。
function fnactionnested() {
console.log("nested complete!");
// do internal stuff here last
}
function nestfn(fn) {
var na = fnactionnested;
fnactionnested = function() {
fn();
na();
}
console.log("nested " + fn.toString());
}
function nestgo() {
// do internal stuff here first
fnactionidx = 0;
fnactionnested();
}
この例でのサブスクライブは、nestfn で行われます。明示的であるため、実行がどの順序で行われるかはあまり気にしないことに注意してください。最初の例では、Array.unshift を使用できました。
2番目のものがもっと推奨されているのを見ました。私の疑いでは、2 番目のものは Javascript が関数型言語として関数に柔軟であることを利用するという点で Javascript に似ていますが、ラッパー関数内のラッパー関数内に関数があるため、おそらくかなり多くのメモリ オーバーヘッドが発生します。など、サブスクライバーの数に応じて異なります。
どのアプローチが望ましいかについて何か考えはありますか?
文字列ベースのイベント サブシステムを使用したくないことに注意してください。これら 2 つの戦略を区別したいだけです。または、「グローバル」イベント システムを経由せずにこれら 2 つに非常に似た処理を行う別のコールバック戦略がある場合にのみ使用します。いくつかの文字列キー。