JavascriptのsetTimeout()は引数の渡し方に注意。

嵌ったのでメモ。

例えば下記のような関数が定義されていたとする。

var noname = function(arg1, arg2, arg3){
	console.log(arg1);
	console.log(arg2);
	console.log(arg3);
}

まずsetTimeoutで単純に関数を呼びたいだけの場合。
第1引数に関数名を指定する際、クオーテーションで括る方法と括らない方法があるので注意。

// 括る場合
setTimeout('noname()', 1000);
// 括らない場合
setTimeout(noname, 1000);

第1引数をクオーテーションで括った場合、関数名の後に括弧「()」が無いと正常に動作しない。
逆に括らなかった場合は括弧をつけてしまうと意図しない動作になる。

下記に示す記述方法はいずれも正常に動作しない例。

// 第2引数のms指定は無視され、即座に関数が呼び出される。
setTimeout(noname(), 1000);
// もはや動作しないパターン。
setTimeout('noname', 1000);

次にnoname()関数に変数を渡したい場合の記述方法。
この際もクオーテーションで括る場合と括らない場合で変数の渡し方に違いがあるので注意。

// 括る場合
setTimeout('noname("first", "second", "third")', 1000);
// 括らない場合
setTimeout(noname, 1000, 'first', 'second', 'third');
↓
[console]
first
second
third 

そして下記は例の如く正常に動作しない。

// 指定の間隔後に関数は呼び出されるが、変数は渡されない。
setTimeout('noname()', 1000, 'first', 'second', 'third');
// 変数は渡され実行もされるが、第2引数が無視されるので即座に呼び出されてしまう。
setTimeout(noname('first', 'second', 'third'), 1000);

見るページごとに書いてあることが違う気がするけど、全てちゃんと実験したので上記の情報は間違いないはず。
※問題児(IE)でもデバッグ済み。