私が構築している Web アプリの一部として、サーバーから一度に複数のコマンドを受け取ることができます。
これらのコマンドが処理されると、データが更新される傾向があり、かなり重いページ HTML 生成が発生する可能性があります。
複数の同様のコマンドが入った瞬間に、プログラムはデータを処理し、ページの一部が毎回再生成されます。これにより、多くの無駄な処理時間が発生する可能性があります。
そのため、コールスタックを作成しようとしているため、コマンドが処理されると、コマンドがトリガーする関数がスタックにあるかどうかが確認され、見つからない場合は追加されます。
私の問題は、コールスタックから呼び出された関数を正しいスコープに保ちながら、重複を排除できることです。
ベースコード:
var tools = {
functions:{
function1: function(){
return this;
},
function2: function(){
}
},
unique: function(arr){
var returnArr=[],
x, i;
for (x=0; x<arr.length; x++){
for (i=(x+1); i<arr.length; i++){
if (arr[x]===arr[i]){
arr.splice(i, 1);
}
}
returnArr.push(arr[x]);
}
return returnArr;
}
}
例 1:
var callstack=[tools.functions.function1, tools.functions.function1];
callstack = tools.unique(callstack);
for (var x=0; x<callstack.length; x++){
console.log(callstack[x](), "should equal tools.functions");
}
「this」は [function()] を返すため、これは失敗します。
例 2:
var callstack=[
(function(){return tools.functions.function1()}),
(function(){return tools.functions.function1()})
];
callstack = tools.unique(callstack);
for (var x=0; x<callstack.length; x++){
console.log(callstack[x](), "should equal tools.functions");
}
関数が一意であることを保証できないため、これは失敗します。そのため、関数は 2 回実行されます。
これは、2 つの配列 (関数の名前を追跡するものと、カプセル化された関数を保持するもの) を使用して同期を保つことで回避できますが、.電話しても見えない。
JSFiddle: http://jsfiddle.net/Kj6E8/