[フロントエンドインタビューの質問] 手ぶれ補正とスロットリングとは何ですか? 違いは何ですか? どのように達成するか?

アンチシェイク-この機能は、高周波イベントがトリガーされてからn秒後に1 回だけ実行されます高周波イベントがn秒以内に再度トリガーされると、時間が再計算されます。

アイデア: イベントがトリガーされるたびに、前の遅延呼び出しメソッドをキャンセルします。

関数デバウンス( fn ) {

タイムアウト= null        にする

        // タイマーの戻り値を格納するマーカーを作成します

        戻り関数() {

                clearTimeout(タイムアウト)

                // ユーザーが入力するたびに、前の setTimeout をクリアします

                タイムアウト= setTimeout(() => {

                        // 次に、文字を入力してからの時間を保証できるように setTimeout を新規作成します

                        インターバル期間内にまだ文字入力が残っている場合、fn 関数は実行されません。

                        fn apply ( this , argument )

                }、500

        }

}

関数sayHi () {

        console.log ( '手ぶれ補正が成功しました ' )

}

var inp =ドキュメント。getElementById ( 'inp' )inp. addEventListener ( 'input' , debounce(sayHi))

スロットル-高頻度のイベントがトリガーされますが、n秒に1 回しか実行されないため、スロットリングにより関数の実行頻度が低くなります。

アイデア: イベントがトリガーされるたびに、実行を待機している遅延関数があるかどうかが判断されます。

関数スロットル( fn ) {

        let canRun = true // クロージャを通じてトークンを保存します

        戻り関数() {

                if ( ! canRun ) return

                // 関数の先頭でフラグがtrueかどうかを判定し、trueでない場合はreturn

                canRun = false // すぐに false に設定されます

                setTimeout(() => {

                        // 外部から渡された関数の実行をsetTimeoutに入れる

                        fn apply ( this , argument )

                        // 最後に、setTimeout の実行が完了したら、フラグを true (キー) に設定して、次のループを実行できることを示します。タイマーが実行されていない場合、フラグは常に false であり、最初に返されます。

                        canRun = true

                }、500

        }

}

関数SayHi ( e ) {

        コンソール。log ( e . target . innerWidth e . target . innerHeight )

}

窓。addEventListener ( 'resize' , throttle(sayHi))

おすすめ

転載: blog.csdn.net/qq_38679823/article/details/127899319