Я обнаружил этот маленький трюк во время просмотра знаменитого видео Пола Айриша об исходном коде 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/”