Какой смысл делать window.undefined = window.undefined

Я смотрел прошлые версии кода jQuery, и кажется, что в каждой версии у них есть эта строка кода где-то внутри:

window.undefined = window.undefined;

Я не могу понять, почему это важно и что еще важнее, что это делает. Кажется, это присваивание undefined до undefined, что не имеет для меня никакого смысла.

Однако это кажется важным, и мне это интересно.

Ответы

Ответ 1

window.undefined не всегда существовал, поэтому код, подобный if (foo === undefined), выкидывал бы ReferenceError в старых браузерах, потому что undefined не определен (т.е. он не объявлен). Этот код просто гарантирует, что undefined определен (как undefined).

Это не так уж и ненужно, потому что существует так много способов получить значение undefined без одноименного глобального свойства. Например, вы могли бы написать if (foo === void 0) или даже что-то вроде if (foo === [][0]).

Более поздние версии, похоже, предполагают, что window.undefined существует во всех поддерживаемых браузерах. последние версии используют шаблон, подобный этому:

(function( window, undefined ) {
    ...
})( window );

Обратите внимание, что для undefined не передается значение, поэтому он гарантированно объявляется как локальная переменная и имеет значение undefined.

Ответ 2

Используя это, jQuery определяет глобальную переменную с вещественным значением undefined. имея глобальную переменную типа myvar, означает, что вы используете эту переменную в своей области window (например, window.mywar), если вы запустите этот код в области окна:

var myvar = "whatever";

javascript определяет вашу переменную, как если бы вы ее выполнили:

window.myvar = "whatever";

Предположим, что у нас нет глобальной переменной типа myundefined, что означает, что window.myundefined не существует, а window.myundefined не имеет значения, это означает, что window.myundefined действительно undefined, тогда вы можете создать глобальный переменную с именем undefined в области вашего окна, например:

window.undefined = window.myundefined

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

window.undefined = window.myundefined

или

window.undefined = window.whatever_you_want_with_no_value

оба определяют глобальную переменную без значения.