Передача undefined в JavaScript с немедленным вызовом функциональных выражений

Иногда вы можете найти старый код в дикой природе, гдеundefinedпередается в функцию. Почему?

Я обнаружил этот маленький трюк, когда смотрел знаменитыйВидео Пола Айриша об исходном коде jQuery.

Это видео из другой эпохи, ему 9 лет на момент написания, и с тех пор исходный код jQuery изменился, так что вы не можете найти там эту штуку, но это все же то, что я нашел интересным.

Кроме того, с тех пор изменился JavaScript. Этот метод применялся только к JavaScript до ES5.

До ES5, выпущенного в 2009 году, это был почти необходимый шаг.

Примечание: кодовые базы ES5 + больше не нужно добавлять, потому что теперьundefinedзначение только для чтения.

Иногда в нашем коде мы проверяем переменные, чтобы убедиться, что они не определены, следующим образом:

if (car !== undefined) {

}

Если это наш код, который работает на наших собственных серверах, которые мы контролируем, это должно работать нормально. Но представьте, что такую библиотеку, как jQuery, нужно протестировать в боевых условиях, чтобы она работала на всех возможных сайтах.

Если кто-то перезаписываетundefinedс простым

undefined = '🤔' //whatever value you prefer

тогда вышеifпотерпит неудачу, сравниваяcarк🤔.

С тех пор это было исправлено в ES5, но раньше это было возможно.

Еслиcarна самом деле не было определено, сейчас не было возможности узнать.

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

(function() {
  /* our function code */
})()
(function(undefined) {
  /* our function code */
})()

Видеть,undefinedпередается как аргумент, но не передается как параметр при вызове функции. Итак, внутри функции значение переменнойundefinedявляется (гарантированным) исходным значениемundefined. Независимо от того, что с ним делают другие скрипты на странице, он изолирован.

Теперь мой любимый способ решить эту проблему - использовать эту технику для проверки неопределенных значений:

if (typeof car !== 'undefined') {

}

ВtypeofОператор возвращает строку с типом переменной. Мы можем проверить это по'undefined'строка, и мы бы не столкнулись с указанной выше проблемой.

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

Скачать мою бесплатнуюРуководство для начинающих по JavaScript


Больше руководств по js: