Когда мне понадобится немедленно вызвать анонимную функцию javascript? - PullRequest
2 голосов
/ 27 января 2012

Я не вижу ситуации, когда мне нужно это

(function(param){
alert(param);
//do something
})("derp");

вместо этого

alert("derp");
//do something

РЕДАКТИРОВАТЬ: хорошо, спасибо всем, я думаю, что я понял.так что если у вас есть это:

var param = "x";
var heya = "y";

(function(param){
    alert(param);
    //do something
    })(heya);

глобальная переменная "param" будет игнорироваться в области действия анонимной функции?

Ответы [ 4 ]

3 голосов
/ 27 января 2012

Как насчет этого сценария?

Пример # 1 - Использует выражение вызова немедленно вызванной функции, которое закрывает одну переменную и возвращает другую функцию.В результате получается красивая инкапсулированная функция.

var tick = (function () {
   //Example of function expression + closure
   var tock = 0;

   return function() {
        return ++tock;
   }
}());

//It is impossible to alter `tock` other than using tick()
tick(); //1
tick(); //2
tick(); //3
tick(); //4

VERSUS

Пример # 2 - Использование объявления функции с глобальной переменной

//Unnecssary global (unless wrapped in another function, such as jQuery's ready function)
var tock = 0;

function tick() {
    return ++tock;
}

tick(); //1
tock = 4; //tock is exposed... and can be manipulated
tick(); //5
tock = 6;
tick(); //7

Это надуманный пример, но он все же является реальным сценарием в ситуациях, когда люди могут захотеть создать последовательные уникальные идентификаторы без возможности столкновения.

1 голос
/ 27 января 2012

Что ж, в приведенном вами примере нет, вероятно, нет никаких причин, по которым вы бы это делали.

Однако такой шаблон обычно используется для обеспечения того, чтобы переменные или функциитребуют на глобальном уровне

  • Может быть изолирован от других, потенциально определенных в других библиотеках
    • , таким образом, является эффективным способом скрытия частных переменных
  • Может быть защищен от несанкционированного доступа другими библиотеками

Глобалы в Javascript являются злыми.

В частности, при работе с jQuery я буду часто заключать в$(callback(){}) в такой функции, чтобы я мог иметь глобальное состояние для кода jQuery, который мне не нужен, внутри самого обратного вызова, обычно потому, что у меня есть другой код, который не обязательно зависит от инициализации, готовой для jQuery:

function(){
  var something = 'something';
  $(function(){
    something = 'jQuery bound';
  });
}();
1 голос
/ 27 января 2012

Ну, вы не - для этого простого примера.

В JavaScript переменные видны для функций; следовательно, если вы заключите его в функцию, вы избежите загрязнения глобального пространства имен.

0 голосов
/ 27 января 2012

Помимо загрязнения глобального пространства имен, использование памяти является еще одной причиной для этого - если вы используете большую структуру данных, которая используется только один раз, оборачивая ее в блок (function () {}) () означает, что вы знаете, что он будет очищен после завершения выполнения функции.

...