2

ウィンドウのサイズ変更が完了した後に関数を起動する方法に関する投稿を読んでいて、自己実行型の匿名関数を変数に割り当てた例をいくつか見つけました。

var delay = (function(){
    var timer = 0;
    return function(callback, ms){
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

$(window).resize(function() {
    delay(function(){
      alert('Resize...');
      //...
    }, 500);
});

従来の使用とは対照的に、関数オペランドを自己実行させることの違い/利点は何ですか? すなわち

var delay = function() { ... 
4

1 に答える 1

6

これの主な理由は名前空間変数です。関数は、新しい変数スコープを導入します。上記の例の場合、timerそれを必要とするコードで引き続き使用できる一方で、グローバル名前空間を破壊することはありません。


どうやら明確にする必要があるので:

目標は、関数の外に変数を持つことです。

var timer;

function delay() {
   // use timer
}

変数が関数内にある場合、毎回再初期化されるためです。ただし、関数の外で永続的な値が必要です。

ただし、上記のコードtimerではグローバル変数です。私たちはそれを望んでいません。それを避けるために、変数を新しいスコープで閉じて、delay関数からアクセスできるようにしますが、グローバルにはアクセスできません。

var delay = (function () {
    var timer;

    return function () {
        // use timer
    };
})();

delay以前と同じように、timerそれ自体の外部で使用できる関数にtimerなりましたが、グローバルスコープにはありません。

于 2012-12-07T08:49:26.657 に答える