2017-01-20 5 views
0

setTimeoutメソッドがJSで動作する方法に混乱します。 なぜfirstFunctionを呼び出すのですか?setTimeoutは一度だけ実行され、secondFunctionを呼び出すと、関数の呼び出しが続けられます。setTimeout JSが動作し続ける

一貫性が期待されます。 firstFunction、setTimeoutのいずれかがlog関数の呼び出しを続けるか、またはsecondFunctionでsetTimeoutはsecondFunctionを一度呼び出して終了します。

var firstFunction = function(){ 
    var log = console.log('hello') 
    setTimeout(log, 2000); 
} 

firstFunction(); 

var secondFunction = function(str){ 
    console.log(str) 
    setTimeout("secondFunction('test')", 2000); 
} 

secondFunction('test'); 
+2

:しかし、あなたはまた、このようにそれを行うことができますsetTimeout –

+0

タイムアウトは*タイムアウト*です。彼らは無期限に実行されません(あなたがそれらをクリアするまで)、**回**実行されます。 2番目の例の場合、タイムアウトは関数*を呼び出す*インターバル*( 'setInterval')の効果を無期限に呼び出します。 – Li357

+0

最初の例でも、 'console.log'は何も返さないのでタイムアウトが間違って設定されています – Li357

答えて

2

最初のスニペットが間違っています。 console.log('hello')がすぐに実行され、タイムアウトは何もトリガーしません。その例ではlogundefinedです。実行)

1:あなたは次のことを行うように指示されているため、2番目のスニペットは永遠にループし

var firstFunction = function(){ 
 
    var log = function() { console.log('hello'); }; 
 
    setTimeout(log, 2000); 
 
} 
 

 
firstFunction();

:ここ

は、実施例は次のようになります。ステートメントsecondFunction('test')

2)パラメーターを記録し、2秒間タイムアウトを設定します。

3)タイムアウト終了後、声明secondFunction('test')

4)のパラメータを記録し、2秒間のタイムアウトを設定を実行します。タイムアウトが終了すると、声明secondFunction('test')

を実行

5)...

n)は永遠に

var secondFunction = function(str){ 
 
    console.log(str) 
 
    setTimeout("secondFunction('test')", 2000); 
 
} 
 

 
secondFunction('test');

お知らせを繰り返し、その最初の例では、タイムアウトがfirstFunctionを再度呼び出さなかった場合は、という関数を呼び出します、およびlogは、別のタイムアウトコールバックを作成しないため、一度だけ実行されます。

**編集 - 関数パラメータとして文字列を使用しないで呼び出す方法**

また、これを文字列で呼び出すのはおそらく好ましくありません。関数への参照を使用して呼び出します。これは、関数logが宣言され、setTimeoutに渡された最初の例で実証されています。しかし、 `firstFunction`がで` log`(つまり、何でも)関数を呼び出す - `secondFunction`はsetTimeoutメソッドで` secondFunction`呼び出すため

var thirdFunction = function(){ 
 
    setTimeout(function() { console.log('Hello World'); }, 1000); 
 
} 
 

 
thirdFunction();

+0

私は参照しています。それを感謝します....また、私はそれをコードすることができますので、私は文字列に関数を配置する必要はありません任意の方法はありますか? –

+0

答えの更新を参照してください。例1と3は、文字列を使用しないで呼び出す方法を示しています。 – GantTheWanderer

+0

文字列を使って呼び出すことと、関数への参照を使って呼び出すことの違いを教えていただけたら不思議です –

関連する問題