setTimeoutで質問です



0   名前: Kite9 : 2006/04/10 15:58
setTimeoutでsetTimeout('kansu()',1000)というように関数を<'>で囲みますが、
これはどうしてですか。関数を文字列にしてしまうのではないでしょうか。
setTimeout(kansu(),1000)だとどうしていけないんでしょうか。お教えください。

1   名前: Pid : 2006/04/10 15:58
> setTimeout(kansu(),1000)だとどうしていけないんでしょうか。

() は「その関数を呼び出す」という意味です。

  (a). setTimeout (kansu (), 1000);

これだと kansu がその場で実行され,その戻り値が setTimeout の第一引数として渡されます。


* * *

setTimeout に kansu を渡す場合,

  (b). setTimeout ('kansu ()', 1000);

のように文字列を渡せば,文字列が関数コードとして実行される決まりになっています。もしくは

  (c). setTimeout (kansu, 1000);

と,() を付けずに関数本体を渡しても良いです。

個人的には,J(ava)Script での文字列操作は,避けられるなら避けた方が良いと感じています(write や innerHTML なども同様)。方法 (c) をお勧めします。

※ただし,(c) がサポートされたのは JavaScript 1.2 以降(NN 4.0,IE 5.0)です。


* * *

関連して,もし kansu に引数を渡したければ,

  (d). function tmp () { kansu (10, 20); }; setTimeout (tmp, 1000);

のように別関数で包んでおきます。しかし,いちいち別関数を作るのが面倒なら

  (e). setTimeout (function () { kansu (10, 20); }, 1000);

のように無名関数にしても良いでしょう。

2   名前: Kite9 : 2006/04/10 15:58
Pidさん、ありがとうございます!
なるほど、setTimeoutですから即実行はまずいわけですね。納得です。
その他丁寧な解説いつもながら参考になります。多謝。

一覧へ戻る