プロが教える店舗&オフィスのセキュリティ対策術

http://crocro.com/write/manga_javascript/wiki.cg …
の『タイマー』についての補足 他

マンガ中、タイマーの引数は『"tokei()"』と文字列で書きました。

function tokei() {
var ele = document.getElementById("target");
ele.innerHTML = Date().toLocaleString();
window.setTimeout("tokei()", 1000);
}
この部分には、関数を指定することもできます。

function tokei() {
var ele = document.getElementById("target");
ele.innerHTML = Date().toLocaleString();
window.setTimeout(tokei, 1000);
}

という部分があります。
"tokei()"と文字列で指定しているのに関数として扱われる理由
tokeiと指定してありtokei()で無いのに関数として扱われる理由を教えて下さい。

もしくは、参考になるURLを教えて下さい。

A 回答 (2件)

こんにちは



書式が2種類あります。
https://developer.mozilla.org/ja/docs/Web/API/Wi …

文字列を引数にするとスクリプトのコードとして解釈されますが、この書式は非推奨になっています。

>tokeiと指定してありtokei()で無いのに関数として扱われる理由
>を教えて下さい。
第一引数にfunctionを渡すことになっているからですが、例えば
var func = function(){ alert("hoge"); }
setTimeout(func, 1000);
とした場合は、1秒後にfuncが実行されてアラートがでます。
setTimeout(func(), 1000);
とすると、setTimeoutの引数を評価する際にfuncが実行されてアラートがでますが、1秒後に実行される関数が存在しないので何も起きないことになります。

var func2 = function(){
return function(){ alert("hoge"); }
}
setTimeout(func2(), 1000);
とすれば、引数評価時にfunc2が実行され返される匿名関数が引数として評価され、1秒後にアラートがでることになります。
    • good
    • 1
この回答へのお礼

先生、非常にわかりやすかったです。

お礼日時:2016/08/15 08:02

一般に引数は関数名を文字列といて渡します


なぜといわれてもそういうルールだからとしか
setTimeout("tokei", 1000);

最近は無名関数を使いこういう書き方の方が主流かも
setTimeout(function(){tokei()}, 1000);
    • good
    • 0
この回答へのお礼

まーそうですが。

お礼日時:2016/08/15 08:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!