2016-09-24 8 views
2

これは100msごとに実行する必要がありますが、一度だけビープ音が鳴ります。なぜこの機能は1回だけ実行されますか?

私はsetIntervalについて知っていますが、これは私を混乱させます。

var test = function() { 
    console.log('beep') 
    setTimeout(test, 100); 
}(); 

これは一度だけ実行され、永遠に実行されるのはなぜ分かりませんか?

+0

ヒント: 'var test = function(){console.log( 'beep'); setTimeout(test、100);リターン「私は機能ではない」。 }(); console.log(test); ' – Tibrogargan

+0

@ torazaburoおそらく同じことをする必要があります – Tibrogargan

+2

"同じ "=コンソールで実行します。 'setTimeout(undefined、100) 'の呼び出しは残念ながらエラーを発生させません。 – Tibrogargan

答えて

7

匿名関数が実行されています。

名前付き関数式としてそれを宣言することができます。

(function test() { 
 
    console.log('beep') 
 
    setTimeout(test, 100); 
 
})();

や代入後までの関数を呼び出す延期:

var test = function() { 
 
    console.log('beep') 
 
    setTimeout(test, 100); 
 
}; 
 
test();

+0

匿名ではないので、私はそこに 'var'を入れて、名前とすべてを与えました、巻上げはどうですか? (頭が爆発する)ありがとう!今私たちはこの答えのGoogleクエリの質問を理解することができた場合... – DigitalDesignDj

+1

@DigitalDesignDjあなたのコードは "test"と呼ばれる変数を宣言し、直ちに呼び出される関数式の戻り値を代入します。コンパイラは既にそれが式であり、宣言ではないことを既に理解しているため、IIFEには角括弧は必要ありません。 (BTW、戻り値は定義されていませんが、ハニー・オッヒャー^ Htheコンパイラは気にしません) – Tibrogargan

+1

@DigitalDesignDj割り当て操作後まで参照するための名前を持たないという意味で匿名です。あなたは['Function#name'](https://developer.mozilla)を読むことに興味があります。org/ja-ja/docs/Web/JavaScript/Reference/Global_Objects/Function/name)を参照してください。 – 4castle

2

OPは変数testを関数の戻り値にしました。関数自体は返しませんでした。

あなたが行うことができます:それはtestに割り当てられている前

var test = function(){ 
    setTimeout(test,100); 
}; 
test(); 

それとも

(function test() { 
    setTimeout(test, 100); 
})(); 
+0

'test'は関数ではありませんが、test()は明らかに失敗します。 – Tibrogargan

+0

私はOPのコードで、匿名関数の戻り値を 'test'にしたと言っています。 – Shawn

+0

おそらく、変更を推奨するものを表示するために編集する必要があります。私は理解していると思うが、あまり明確ではない。 – 4castle

-3

リンク以下はこの

var test = function() { 
console.log('beep'); 
} 
setInterval(test, 300); 
+0

OPはsetIntervalを知っています。これは彼らの質問に答えるものではありません。 – 4castle

-1

のように試してみてくださいは、すなわち解答が含まれています作成段階の後に実行段階が続きます。テスト変数は、関数が実行されるときに実行フェーズで未定義です。 https://m.youtube.com/watch?v=Bv_5Zv5c-Ts

+2

これは理論的に質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にすることが望ましいです(// meta.stackoverflow.com/q/8259)。 – 4castle

+0

必須部分は、テストフェーズでJavaScriptランタイムエンジンによってテストが未定義に設定されている実行フェーズです。また、私は参照リンクを追加しました – Vishal

関連する問題