setTimeout で実行する関数に引数を渡す
2010/05/12(水) 25:16 Javascript親記事へこのエントリーをはてなブックマークに追加

setTimeout 関数は指定された時間の後に、コード文字列の評価または関数を実行する。
第一引数に渡せるものは、コードとなる文字列か関数オブジェクトを渡すことができる。
文字列を渡した場合はその文字列が eval によって評価されるが、eval される分処理が必要
になることや、文字列として渡されたものが安全かどうか確認できてない場合などがある
ためできる限り避ける方がよい。
今回は setTimeout に関数オブジェクトを渡し、その関数オブジェクトに引数を持たせて実
行させる方法を考える。
一つの方法としては匿名関数を使った方法がある。匿名関数で setTimeout を囲いスコープ
を作り、その匿名関数に引数を渡して実行させることでそれぞれのスコープ内で
setTimeout 関数が実行できる。
var ary = ["foo","bar","hoge"]
for(var i=0,len=ary.length;i<len;i++){
    (function(arg){
        window.setTimeout(function() { alert(arg); }, i * 1000);
    })(ary[i]);
}// "foo","bar","hoge"が一秒後づつ出現
new Functionを使うことでもでき、やっていることはevalとほぼ同様で文字列を関数として実行しているだけである。
内部的な動作は違うがやはり上記の匿名関数を使った方が良い。
15.3 Function オブジェクト
15.1 Global オブジェクト (The Global Object)
var ary = ["foo","bar","hoge"]
for(var i=0,len=ary.length;i<len;i++){
     window.setTimeout(new Function('alert("'+ary[i]+'")'), i * 1000);
}
最後にFirefox にはsetTimeout に第三引数があり、setTimeout(func, delay[, param1,
param2, ...]); という形で第三引数以降に渡した引数をfunc に渡し実行することが可能であ
る。しかし、このsetTimeout 関数はDOM Level 0 であるため標準化はされていない。
var ary = ["foo","bar","hoge"]
for(var i=0,len=ary.length;i<len;i++){
    setTimeout(alert , i*1000 , ary[i]);
}
他にもいろいろな方法がある。使えるブラウザが限定されるけど。
SCRAPBLOG : setTimeout のコールバック関数内でローカル変数を使用する
http://www.xuldev.org/blog/?p=136


名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/039/tb/
  • Chapter 3. Dates, Time, and Timers prog*sig azu
    ■3.4  Converting an ISO 8601 Formatted Date to a Format Acceptable to the Date ObjectISO 8601からDateオブジェクトに変換してみる。 var dtstr= "2...