Чому ці два параметри у джерелі jQuery для?

Джерело jQuery загорнуто в закриті вікна, як це:

(function(window, undefined) {
   //awesome jQuery library code in here
})(window);

Я не розумію, чому один з цих параметрів потрібен.

Оскільки вікно є глобальною змінною, чому його потрібно передати? Яка мета переходу в глобальний параметр і доступ до неї всередині закриття з однаковим ім'ям?

Що таке параметр undefined для? Чому ніяке значення не передано йому?

6
Вікно буде використано як локальний у цьому масштабі, що робить його більш швидким для доступу, я думаю.
додано Автор Ibu, джерело

1 Відповіді

Я впевнений, що на це вже дали відповідь, але:

  • перехід у вікно a) дозволяє стиснення коду змінювати ім'я (тобто замінювати його однією буквою змінною в анонімній функції) і b) гарантує, що змінна посилається на вікно об'єкта в той час, коли бібліотека визначена, на всякий випадок, якщо хтось перевизначить window у глобальному масштабі після завантаження jQuery.

  • у тому числі undefined як аргумент (але не передається у значення) робить те ж саме для undefined , що дозволяє змінювати обману і уникати проблем, якщо undefined перевизначено (так, Javascript дозволяє це).

Я вірю в обох випадках, що це прискорює посилання на змінну, оскільки це робить обидві глобальні змінні доступними в області функцій, які інтерпретатор буде шукати, перш ніж шукати в глобальному масштабі. Але я не можу чесно уявити, що різниця в продуктивності тут суттєва - я думаю, що найбільшою проблемою є ім'я змінної назви, що призводить до більш компактного коду при мінімізації.

11
додано
Якщо window було перевизначено у глобальному масштабі, чи не буде він все-таки змінено, коли ви його перейдете?
додано Автор Peter Olson, джерело
цілком має сенс +1
додано Автор Ibu, джерело
@PeterOlson Я думаю, що тоді "стиснення коду для обману" буде причиною
додано Автор Ibu, джерело
@PeterOlson - якщо це не буде змінено пізніше - це виправляє посилання window під час завантаження бібліотеки jQuery, тому наступні window shenanigans не матимуть ефекту. Я думаю, якщо ви перевизначите вікно перед завантаженням бібліотеки, це зламається, але тоді ви заслуговуєте того, що ви отримаєте :).
додано Автор nrabinowitz, джерело
Придумайте, змінна undefined також може бути перевизначена, тому це також захищає це. Оновлено відповідь.
додано Автор nrabinowitz, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram