Array オブジェクトを setInterval 関数に渡す方法
-
16-09-2019 - |
質問
JavascriptのsetTimer関数にオブジェクト配列を渡したいと考えています。
setTimer("foo(object_array)",1000);
このコードでエラーが発生します。
**注意:**申し訳ありません!私の質問のいくつかの修正:setInterval()関数で可能ですか?
解決
の最初のパラメータに文字列の代わりに匿名関数を使用します。 setTimeout または セット間隔 機能:
// assuming that object_array is available on this scope
setInterval(function () { foo(object_array); }, 1000);
なぜ効果があるのか:
内部関数を定義すると、親機能がすでに終了した後でも、外側の囲い関数に存在する変数を参照できます。
この言語機能は次のように呼ばれます。 クロージャ.
これらの関数の最初の引数として文字列を渡すと、コードは、 評価 関数、そしてこれを行うことは ない として考慮されます いい練習.
Eval は、JavaScript コンパイラへの直接アクセスを提供し、渡されたコードを呼び出し元の権限で実行します。これも eval を使用します。 繰り返し/広範囲に (すなわち、setInterval 関数が良い例です) パフォーマンスの問題につながります。
他のヒント
私はそれがCMSの(と質問のこの種のほとんどの答えは)ないというユースケースを扱っているため、ここでルークの答えに拡大するつもりです。
あなたが関数呼び出しにあなたの引数をバインドする必要がある場合は、のあなたはのタイムアウトを設定するときに、簡単な関数エンクロージャは動作しません。
echo = function (txt) { console.log(txt); };
val = "immediate A";
echo(val);
val = "delayed";
window.setTimeout(function () { echo(val); }, 1000);
val = "immediate B";
echo(val);
上記の意志出力「即時A」、「即時B」とし、「即時Bは」1秒後、あなたはFirebugののコンソールを使用していると仮定。 setTimeoutメソッドの呼び出し時に値をバインドするには、ルークのトラップ法を使用します。以下は、それが少し任意の関数、引数の長さを受け入れるように変更します。
echo = function (txt) { console.log(txt); };
trap = function (fn, args) {
return function() {
return fn.apply(this, args);
};
};
val = "immediate A";
echo(val);
val = "delayed";
window.setTimeout( trap(echo, [val]), 1000);
val = "immediate B";
echo(val);
そこに暗黙のうちに呼び出し元のコンテキストを渡す方法ですが、さらに「これは」そこにあなたを取得していない場合は、コンテキスト引数を受け入れるように拡張することができれば、わからない。
まず、それはだ 'のsetTimeout'
秒、文字列を渡すことはありません。真の解決策は、コードの残りの部分に依存します。最も強力な方法は、トラップにスコープになります:
var obj_array = something;
function trap(obj)
{
function exec() { foo(obj); }
return exec;
}
setTimeout(trap(obj_array), 1000);
トラップは、その範囲の中に閉じ込め、あなたの配列を持つ関数を返します。これは一般的な機能ですが、あなたの問題にそれが特定するために、それを簡略化することができます:
var obj_array = something;
function trap()
{
function exec() { foo(obj_array); }
return exec;
}
setTimeout(trap(), 1000);
あるいは
var obj_array = something;
function trap()
{
foo(obj_array);
}
setTimeout(trap, 1000);
そして最後まで凝縮します:
var obj_array = something;
setTimeout(function() { foo(object_array); }, 1000);
編集: 私の関数(またはそれらの少なくとも1回の反復が、私はここにバックアップしています)。
Function.prototype.createDelegate = function(inst, args) {
var me = this;
var delegate = function() { me.apply(inst, arguments); }
return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
};
Function.prototype.createAutoDelegate = function() {
var args = arguments;
var me = this;
return function() { me.apply({}, args); }
};
を指定します:
function test(a, b) { alert(a + b); }
USAGEます:
setTimeout(test.createAutoDelegate(1, 2), 1000);
または指定されたます:
var o = { a:1, go : function(b) { alert(b + this.a); }}
USAGEます:
setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);