なんか最近javascriptの話が多いですが気にせずに
setTimeoutが思ったようにうごいてくれなくて色々調べた結果をまとめました
忘れた頃に見直すよう
一番の問題が間違った方法を「正しい」って書いてるとこですね
騙されました
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を呼びます
とりあえず思いついた中で一番簡単に書けるものです
コメント一覧 (3)
setTimeout(func.bind(this),1000);
とするとようやくうまくいきました。
使ってみるとbind便利ですね
ありがとうございました!
コメントする