Рубрики
Без рубрики

Передача неопределенных в JavaScript Выражений функций, вызываемых немедленно

Иногда вы можете обнаружить старый код в дикой природе, где “неопределенный” передается функции. Почему?

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

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

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

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

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

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

if (car !== undefined) {

}

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

Если кто-то перезапишет неопределенный с помощью простого

undefined = '🤔' //whatever value you prefer

тогда вышеприведенный если потерпит неудачу, сравнивая автомобиль для 🤔 .

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

Если car на самом деле не был определен, не было никакого способа узнать, как это сделать.

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

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

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

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

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

}

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

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

Оригинал: “https://flaviocopes.com/javascript-iife-undefined/”