私が構築している 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/