Я пробовал это сам, и я полагаю, что это своего рода закрытие, но я не вижу разницы в этом:
(function() {
var tvLib = {}
window.tvLib = tvLib
})();
из jQuery:
(function(window, undefined) {
var jq;
window.jq = jq;
})(window);
Я растерялся, почему мне нужно отправить объект окна, если я могу назвать его в любом случае.
Одна из причин заключается в том, чтобы позволить minifiers переименовать переменную, чтобы сделать ее более компактной.
Это для целей минимизации/искажения.
Mangling состоит из переименования переменных с ограниченным именем для более коротких имен, чтобы получить некоторые символы и обфускать код. Например, каждое вхождение переменной с переменным myVariable
может быть myVariable
до a
, чтобы получить 9
символов каждый раз, когда оно появляется в коде.
window
и undefined
являются глобальными переменными, они не могут быть искалечены, потому что это, очевидно, нарушит код. Но если вы назначаете переменную с привязкой к их значению/ссылке, это может быть искажено. Если ваша библиотека (например, jQuery) использует большое window
или undefined
, этот метод помогает еще больше уменьшить размер вашего кода.
Итак, возьмем ваш пример:
(function(window, undefined) {
var jq;
window.jq = jq;
})(window);
Дал бы что-то вроде этого искалеченным:
(function(a, b) {
var c;
a.c = c;
})(window);
С другой стороны, важно использовать синтаксис типа массива, когда вы хотите экспортировать глобальные переменные, чтобы избежать их искажения. Таким образом, вы можете смело ссылаться на них извне.
Это было бы лучше в вашем примере:
(function(window, undefined) {
var jq;
window['jq'] = jq;
})(window);
Дал бы что-то вроде этого искалеченным:
(function(a, b) {
var c;
a['jq'] = c;
})(window);