なんか最近javascriptの話が多いですが気にせずに

setTimeoutが思ったようにうごいてくれなくて色々調べた結果をまとめました
忘れた頃に見直すよう

一番の問題が間違った方法を「正しい」って書いてるとこですね
騙されました

setTimeout関数は第二引数の時間経過後に第一引数の関数を実行する関数
function test(x){
	console.log(x);
}
(function(){
	
	setTimeout(function(x){console.log(x);},1000);
	// 1秒後にundefined
	
	setTimeout(function(x){console.log(x);},1000,100);
	// 1秒後に100
	
	setTimeout("test(100)",1000);
	// 1秒後に100 eval("test(100)")を実行?
	
	setTimeout("test(x)",1000);
	// xが未定義エラー グローバルにxを宣言してればグローバルのxで実行
	
	setTimeout("test()",1000,100);
	// 1秒後にundefined
	
	setTimeout("test()",1000);
	// 1秒後にundefined
	
	setTimeout(test,1000);
	// 1秒後にundefined eval(test)ではない??
	
	setTimeout(test,1000,100);
	// 1秒後に100
	
	console.log(eval(test));
	// 関数の中身が表示される
	
	var v = 500;
	setTimeout("test()",1000,v);
	// 1秒後にundefined 変数でも一緒
	
	setTimeout(test,1000,v);
	// 1秒後に500 変数でも一緒
	
	setTimeout(test(v),1000);
	setTimeout(test(),1000,v);
	// test(v),test()を実行して1秒後にtes(v),test()の返り値を実行してるので意味が違う
	
	
})();
結果はコメント部分に書いたとおりです

引数いるなら
 setTimeout(test,1000,v);
引数いらないなら
 setTimeout("test()",1000);
または
 setTimeout(test,1000);
という感じです

setTimeout(test(v),1000);
setTimeout(test(),1000,v);
ネットではこの方法を書いてるところがありましたが、間違ってます
test()関数は呼ばれますが指定した時間のあとではなく即呼ばれます
普通の関数の書き方から考えて第一引数に渡されるものがtest()を実行した返り値ですし
あと、下の方はv使われません

私は
setTimeout("test()",1000,v);
これをずっとやってて動かないって状態でした
evalが実行されるとかどこかで見たので第一引数にtestを渡しても意味ないと思ってましたが
ちゃんと動きます

まとめ
引数いるいらないで分けるの面倒だし
setTimeout(test,1000,v);
って感じに書けばいい!

--
setTimeout調べ始めた理由のthisが使えない問題
function a(){
	this.a = 0;
}
a.prototype = {
	X: 100,
	f: function (){this.a = this.X;},
	set: function (){setTimeout(function(e){e.f();},1000,this);},
	show: function (){console.log(this.a);}
}
x = new a();
x.show(); // 0
x.set();
x.show(); // 0
// 1秒後
x.show(); // 100
とりあえず解決
動かない動かない言っていた方法使わずに
直接関数書いてますけど・・・・

普通に
function (){setTimeout(this.f,1000);}
ってすると
実行される時thisがグローバルスコープ?になってthisの中にfがないってエラーになります
なので
function (){setTimeout(function(e){e.f();},1000,this);}
のようにthisを引数として渡して関数内でメソッドfを呼びます

とりあえず思いついた中で一番簡単に書けるものです