Что это делает, переназначает undefined
на undefined
внутри этого закрытия. Это безотказно. Поскольку другой код может случайно сделать что-то вроде
undefined = something;
console.log(undefined); // will output 'something'
И это действительно в javascript (если используемый JS-движок не реализовал спецификацию ECMAScript 5, в спецификации ECMAScript 5 undefined
нет non-writable
, MDN DOC ),
Цитата из MDN New_in_JavaScript 1.8.5 (ECMA 5) Страница
Изменения в глобальном объекты
Глобальные объекты, сделанные только для чтения
Объекты NaN, Infinity и неопределенные глобальные объекты были сделаны только для чтения по спецификации ECMAScript 5.
blockquote>И из
ES5 Annotated Spec
в Guthub
ES5 spec Section
x15.1.1.3
15.1.1.3 undefined
Значение undefined не определено (см. 8.1).
Это свойство имеет атрибуты {[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.
blockquote>Even если
global undefined
недоступен для записи. У вас может быть локальная переменная с именемundefined
и может испортить ваш код (в основном сравнение сundefined
). Но это ваша ответственность. У вас могут быть такие коды, как(function(){ console.log('Second Case: '); var undefined = 'Something'; console.log(undefined); // Will log `something` var a ; // a is undefined console.log(a === undefined); // false, as undefined is changed // you might expect a === undefined will return true, but as // `undefined` is changed it will return false. console.log(a); // undefined })();
Демо: http://jsfiddle.net/joycse06/V4DKN/
Однако, если
undefined
можно записать то указанное выше назначение может затруднить многиеcomparison
, сделанные с помощьюundefined
после этой строки кода, посколькуundefined
больше неundefined
. Теперь он имеет некоторое значение.Так как они вызывают эту анонимную функцию, например
( window ) // one argument only
И прием
( window, undefined) // only window is passed when calling the function // Second argument is not passed means it's undefined // so undefined is restored to undefined inside that function // and no global accidental assignments can hamper jQuery's // code using 'undefined' now
Это означает, что внутри этого закрытия
undefined
восстанавливается доundefined
, так как он не получил никакого значения, тем самым гарантируя использованиеundefined
внутри этой анонимной функции.Очень хорошая подробная статья об этом http: // javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/
Я цитирую некоторые строки из вышеупомянутой ссылки статьи, чтобы все было ясно
Что не определено?
В JavaScript есть Undefined (type), undefined (value) и undefined (variable).
Undefined (type) является встроенным Тип JavaScript.
undefined (value) является примитивным и является единственным значением типа Undefined.
Любое свойство, которому не присвоено значение, принимает неопределенное значение. (ECMA 4.3.9 и 4.3.10).
Функция без оператора return или функция с пустым оператором return возвращает undefined. Значение аргумента unsupplied function undefined.
var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined"
undefined (variable) - это глобальное свойство, начальное значение которого не определено (значение). Поскольку его глобальное свойство мы также можем получить к нему как переменной , Для согласованности я всегда буду называть это переменной в этой статье.
typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"
Начиная с ECMA 3 его значение можно переназначить:
undefined = "washing machine"; //assign a string to undefined (variable) typeof undefined //"string" f = undefined; typeof f; //"string" f; //"washing machine"
Излишне говорить , переопределение значений неопределенной переменной является очень плохой практикой, и на самом деле она не разрешена ECMA 5.