Подтвердить что ты не робот

Цель передачи глобальных vars на самозапускающуюся функцию или "IIFE"

Я вижу много этого в более раннем JavaScript

(function (w){

    w.bar = 'baz';

 })(window); 

В чем преимущество вышеизложенного, более

(function(){

    window.bar = 'baz';

})(); 

то же самое для любого global variable или переменной, определенной вне IIFE.

4b9b3361

Ответ 1

  • Указывает на то, что вы используете (и, возможно, модифицируете) глобальные функции в функции.
  • Позволяет изменить поведение в будущем. Возможно, у вас есть mockWindow для unit test. Возможно, вы используете Node.js, и у вас нет window, но вместо этого нужно добавить к globals var.

p.s. ИМО тривиальное увеличение производительности, упомянутое @Районом, - это красная селедка.

Ответ 2

На практике не так много различий (нет?) с приведенным вами примером, но у вас есть , возможно, упрощенное из кода, который вы на самом деле смотрите.

В более реалистичной программе вы будете иметь области и обратные вызовы, которые запускаются и запускаются в eventloop асинхронно, и вы привязываете переменную к определенному экземпляру в закрытии - так что

(function (w){
    setTimeout(function(){w.bar = 'baz';},100);
})(window); 
window = window2;

Бар все еще устанавливается в исходном окне, так как это то, что связано с w - где в

(function (){
    setTimeout(function(){window.bar = 'baz';},10);
})(window); 
window = window2;

Он будет установлен в окне экземпляра2, так как это то, как окно связано, когда выполнение кода в конечном итоге происходит.

В этом примере "окно" представляет собой глобальную переменную, но то же самое имеет место независимо от области действия связанной переменной.

Ответ 3

Проходящее окно выполняется, потому что локальные переменные легче и быстрее доступны, чем глобальные переменные... это может иметь небольшую разницу в производительности. Этот метод действительно пригодится с модульными шаблонами и/или инъекцией зависимостей.

Пример

var moduleFirst = (function(){
    var name = "harry";
    return {
        firstparam : name
    }
})();
var moduleTwo = (function(x){
    console.log(x.firstparam);
})(moduleFirst)

Выход будет: harry

Итак, когда окно переходит в IIFE; все его обнаруженные методы доступны в локальной переменной.

Ответ 4

Передавая глобальные объекты, такие как window, document, $to IIFE (Immediately Invoked Function Expression), можно повысить производительность за счет сокращения времени поиска области. Помните, что Javascript сначала ищет свойство в локальной области и вверх по цепочке до глобальной области. Таким образом, доступ к объекту окна в локальной области сокращает время поиска.