コードは複雑ではなく、ロジックは非常に単純です。機能の調整です。コードを直接記述します。
リーリー理論的には、ブラウザのウィンドウ サイズを変更し続けると (つまり、間隔が 1 秒未満である必要があります)、2 回目以降 doSomthing
は実行されなくなります。常に cleraTimeout
を実行しているため、実際の実行結果は console.log('count 'th execution)
です。実際には出力されませんが、ブラウザ ウィンドウの変更を停止すると、確認したところ、出力された count
は 1
ではなく、非常に大きな数であることがわかりました。
これは、このコードで次のことを示しています:
リーリーsetTimeout()
の匿名関数は実行されず、匿名関数内のfn.apply()
が実行されるのですが、原理を教えてください。それとも私のコード自体に何か問題があるのでしょうか?
にあるものに加えて、
ブラウザのサイズを変更する場合、else のこのsetTimeout
には リーリーはしきい値ミリ秒ごとに実行されます
つまり、fn.apply
は確かに 1 回だけ実行され、残りの回数は else
によって実行されます。setTimeout
确实只执行了一次,其余的次数是else里的fn.apply
の1 つの サイズ変更 操作は複数の onresize をトリガーします。1 回目は else の内容をトリガーし、もう 1 回は setTimeout の前に clearTimeout() を記述するため、最後の setTimeout の内容が実行されます。したがって、サイズを 1 回変更すると doSomthing が 2 回トリガーされ、出力されるカウントは少なくとも 2 異なります。各サイズ変更の操作イベントが 250 ミリ秒より大きく 1 秒未満の場合、カウント値は大きくなります。