Какова цель параметра с именем "undefined" в функции JavaScript? - программирование
Подтвердить что ты не робот

Какова цель параметра с именем "undefined" в функции JavaScript?

При просмотре несжатого исходного кода jQuery я наткнулся на то, что я не совсем понимаю. Когда они создают анонимную функцию, они помещают undefined в качестве второго аргумента. Что это делает, и почему они используют undefined? Нужно ли помещать undefined в качестве аргумента в анонимную функцию? Ниже приведен пример того, о чем я говорю.

(function( window, undefined)  {
  ...code here
})( window );
4b9b3361

Ответ 1

Что это делает, переназначается undefined до undefined внутри этого закрытия. Это безотказно. Поскольку другой код может случайно сделать что-то вроде

undefined = something;
console.log(undefined); // will output 'something'

И это верно в javascript (если используемый JS-движок не реализовал спецификацию ECMAScript 5, в спецификации ECMAScript 5 spec undefined нет non-writable, MDN DOC),

Цитата из MDN New_in_JavaScript 1.8.5 (ECMA 5) Страница

Изменения глобальных объектов

Глобальные объекты, сделанные только для чтения

NaN, Бесконечность и undefined. объекты были сделаны только для чтения, по спецификации ECMAScript 5.

И из ES5 Annotated Spec в Guthub

ES5 spec Section x15.1.1.3

15.1.1.3 undefined

Значение undefined равно undefined (см. 8.1).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}.

Даже если 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 undefined
          // so undefined is restored to undefined inside that function
          // and no global accidental assignments can hamper jQuery 
          // code using 'undefined' now

Это означает, что внутри этого закрытия undefined восстанавливается до undefined, так как он не передал никакого значения, тем самым гарантируя использование undefined внутри этой анонимной функции.

Очень хорошая подробная статья об этом http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/

Я цитирую некоторые строки из указанной ссылки на статью, чтобы прояснить ситуацию

Что такое undefined?

В JavaScript есть Undefined (тип), Undefined (значение) и Undefined (переменная).

Undefined (тип) - это встроенный тип JavaScript.

Undefined (значение) является примитивным и является единственным значением типа undefined.

Любое свойство, которому не присвоено значение, принимает значение undefined. (ECMA 4.3.9 и 4.3.10).

Функция без оператора return или функция с пустым оператором return возвращает undefined. Значение аргумента unsupplied функции 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 (переменная) - это глобальное свойство, начальным значением которого является undefined (значение). Поскольку его глобальное свойство мы также можем получить к нему как переменной. Для согласованности я всегда буду называть это переменной в этой статье.

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"

Излишне говорить, что переопределение значений переменной undefined является очень плохой практикой, и на самом деле ее не разрешено ECMA 5.

Ответ 2

Undefined является типом, но также является глобальной переменной.

У вас может быть модуль, который перезаписывает значение undefined, выполняя undefined = whatever.

undefined в действительности является параметром undefined функции, обертывающей весь код:

(function(window, undefined) {
    // undefined is the undefined parameter
}(window)); 

Это безопасно, поскольку параметр undefined находится в локальной области, и никто, кроме кода в этой функции, не может назначить ему.

Не нужно использовать undefined в качестве параметра при определении анонимной функции.

Если вы видите выше функцию, вы заметите, что она ожидает два параметра, но один.

Почему undefined нужно восстановить?

потому что, чтобы убедиться, что undefined действительно undefined в области между фигурными фигурными скобками, даже если кто-то написал что-то вроде undefined = "defined"; в глобальной области видимости, потому что undefined может быть действительно переопределено.

Итак, если у вас есть что-то вроде

var undefined = 1;

(function(window, undefined) {
  console.log(undefined); // output will be undefined not 1
}(window));

Ответ 3

jQuery гарантирует, что undefined действительно undefined внутри своей области действия, не передавая аргумент этому параметру.

Возьмите этот код, например, когда undefined на самом деле не undefined:

var undefined = 1;
alert(undefined); // 1