@Diode:無限ループの場合は、シフト&&プッシュの方が適しています。それらを忘れました。その場合、私は次のことを提案します:
var intervalId = setInterval((function(theArray)
{
var target = $('#target');
var current;
return function ()
{
current = theArray.shift();
target.load(current);
theArray.push(current);
};
})($('#target').data('widget-load').split("|")),1000);
これを試して:
var intervalId = setInterval((function(theArray)
{
var target = $('#target');//only search for this once, not on every call
//to make infinite loop, copy the array
var resetArr = theArray.slice(0);//use slice, if not a reference is assigned and both arrays will be altered
//Name is not required, if you want to use a name, pick a better one, next might be reserved (not sure)
//best go for nextInterval, chose this one for explanation
return function next()
{
//get first element, theArray is now 1 shorter
target.load(theArray.splice(0,1)[0]);
if (theArray.length === 0)
{//no more files left -> this stops the interval
//clearInterval(intervalId);
//intervalId = null;
//restore the array, the loop starts from file1 again --> infinite loop
theArray = resetArr.slice(0);//copy the original value
}
}
})($('#target').data('widget-load').split("|")),1000);
これは少し密度が高いかもしれませんが、Chromeコンソールで単純な1行バージョンを試しました。
foo = setInterval((function(arr){ return function(){alert(arr.splice(0,1)[0]); if (arr.length === 0){ clearInterval(foo);}};})([1,2,3]),1000);
そしてそれは魅力のように機能します。
使い方:
intervalId
間隔のermidを保持します...一種の参照。それが設定されている限り、関数はごとに呼び出され1000ms
ます。単純な関数を最初の引数として渡す代わりに、関数を作成してすぐに呼び出します。名前のない関数()に渡した引数には、無名関数の戻り値である、theArray
という関数からアクセスできます。関数内で作成されるため、母親が戻った後でも、母親関数next
のすべての変数にアクセスできます。これは、間隔の実際のコールバックである関数を除いて、の値が他のすべての場所の範囲外であることを意味します。の価値を妨げるものは何もありません
theArray
next
theArray
、外部コードで上書きできるものはないため、グローバルを使用する場合に比べて非常に安全なアプローチになります。
同じことが変数にも当てはまります。匿名のマザーtarget
関数で宣言および初期化され、一度呼び出されてからGCされます。ただし、変数は存続し、jQueryオブジェクトを参照します。DOMはその要素に対して一度だけ検索されましたが、関数への新しい呼び出しはすべてそのオブジェクトにアクセスできます。これを1回実行すると、速度の差はわずかになります。これを常に実行すると、スクリプトが(はるかに)効率的になります。next
したがって、間隔:1000msごとにnext
呼び出されます。theArray
作成者(無名関数)の引数()であった配列から最初の値をシフトします。その配列が空の場合、clearInterval
関数が呼び出されてロットが停止します。すべてのファイルがロードされ、続行しても意味がありません。
これが発生するとすぐtheArray
に、、- next
function、および他のすべての変数(target
)がスコープ外になるため、グローバル変数はなく、メモリのすてきでクリーンなチャンクになります。これは常に良いことです。このコードはイベントハンドラーの一部としてトリガーされると想定しています。この場合、これをコピーしてハンドラーに貼り付けるだけで、グローバルは作成されません。
このコードがグローバルスコープの一部になる場合は、すべてを自己呼び出し関数でラップするだけで、グローバルを簡単に回避できます。
(function()
{
var intervalId = setInterval((function(theArray)
{
//...
})($('#target').data('widget-load').split("|")),1000);
})();
そして、あなたはすべて準備ができています。私見ですが、これはこの問題に対する最良で最も安全で最もJS志向のアプローチです。JavaScriptはすべて関数に関するものであり、それらを活用すればするほど、言語はそれをより好むようになります。実際、その隠された表現力を明らかにすることで、それを感謝します。
この回答を使用しないことにした場合でも、クロージャや関数スコープを最大限に活用する方法などを読んでください。あなたはすぐにあなた自身が全く新しい方法であなたのコードを書いていることに気付くでしょう、約束してください:)