2017-02-16 2 views
3

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

Метод 1:

(function(i) { 
    // Do something to i now 
}(global_variable)) 

Метод 2:

(function() { 
    // Do something to global_variable now 
}()) 

Почему бы вам передать глобальную переменную в функцию, если она будет существовать в этой области видимости в любом случае?

+2

Первый блок кода должен использовать внутри функции 'i', а не' global_variable'. – Barmar

+0

он может увеличить производительность при передаче переменной. В JavaScript, чем ближе по объему переменная, тем быстрее она используется. – David

+1

во избежание конфликтов. Если что-то позже заменяет ссылку, хранящуюся в 'global_variable', код внутри iife не волнует. –

ответ

3

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

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

+0

@rasmeister Пожалуйста, удалите комментарии, которые мы хешировали из этого –

1

для наложения целей, например:

(function(leeloo){ 

    //inside here you can use the short term 

})(LeeloominaiLekataribaLaminaTchaiEkbatDeSebat) 

//this would be similar, it's a matter of preference 
(function(){ 
    var leeloo = LeeloominaiLekataribaLaminaTchaiEkbatDeSebat; 

    //... 
})() 

или вложить значение, как в этом примере:

(function($){ 

    //in here, $ preserves the passed/injected value, 
    //even if the global value changes 

})(jQuery.noConflict()) 

таким образом, вы можете даже использовать несколько версий JQuery на той же странице.

+1

. Обратите внимание, что в вашем втором случае было бы полезно сделать это, если бы вы выполняли что-то асинхронное в iife, иначе не было бы причин его сохранить. Но это почти всегда имеет место с jquery. –

+0

@KevinB 'выполняет что-то асинхронное в iife' ... как и многое, что включает взаимодействие с пользователем, один из основных вариантов использования jquery;). да, jquery - не лучший пример для этого, но лучшее, что приходит мне на ум, не принося много усилий * (оставаясь родовым) *.Это просто использование iife в качестве закрытия для инкапсуляции и сохранения переданного значения независимо от того, что происходит с глобальной переменной. – Thomas

+0

Точно. с jquery вы больше всего привязываете события, тем самым выполняете асинхронные действия. поэтому это хороший пример использования (хотя это можно сделать и с помощью '$ (function ($) {...})') –

1

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

global_variable=true; (function(i){ i=false; return i; }(global_variable)); 

Этот код, однако, очевидно, изменяет global_variable:

global_variable=true; (function(){ global_variable=false; }()); 

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

g=true; (function(g){ g=false; return g; }(g)); 
Смежные вопросы