Подтвердить что ты не робот

Какова цель передачи в undefined?

Я заметил jQuery и связанные с ним плагины с ключевыми словами, такие как jQuery.UI pass undefined в качестве параметра, в анонимные функции, используемые в их определениях модулей, например:

(function($, undefined) { ... })(jQuery);

В качестве альтернативы я заметил другие плагины, рекомендованные jQuery, и/или другие НЕ пропускают undefined в качестве параметра.

Это, наверное, глупый вопрос, но...

Разве он не всегда будет доступен? Зачем его пропускать? Есть ли какая-то другая цель или трюк здесь?

4b9b3361

Ответ 1

Для этого есть две причины:

1) Если undefined - это переменная в области функций, а не как свойство глобального объекта, minifiers может уменьшить ее до одной буквы, тем самым обеспечивая лучшую степень сжатия.

2) До ES5 *, undefined был свойством глобального объекта без защиты от записи. Поэтому он может быть перезаписан, что приводит к странному и неожиданному поведению. Вы можете сделать что-то вроде этого:

var test = 123;
undefined = 123;
if (test === undefined){
   // this will actually be true, since undefined now equals 123
}

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

Btw. самым безопасным методом тестирования для undefined является: typeof ( var ) === 'undefined'

(*) С EcmaScript 5 глобальные свойства undefined, NaN и Infinity стали только для чтения. Поэтому с его общим принятием во всех современных браузерах - конечно, за исключением IE 9 - перезаписать эти значения больше не было.

Ответ 2

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

undefined = 2; // Assign a different value to undefined

// Now this statement would be true
if (undefined == 2)

Итак, чтобы убедиться, что undefined на самом деле undefined, даже если какое-то другое "зло" script переназначало undefined другим значением, вы создаете параметр, который вы называете undefined, и то при вызове функции вы не должны передавать значение этому параметру - таким образом, вы можете быть уверены, что переменная undefined всегда будет undefined внутри вашей функции.

Итак, в случае jQuery:

(function($, undefined) { ... })(jQuery);

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

Современные браузеры

В современных браузерах undefined - это неконфигурируемое, не записываемое для записи свойство спецификация ECMAScript 5.

Ответ 3

undefined не является зарезервированным словом в javascript, это просто переменная. jQuery гарантирует, что если какой-нибудь плохой разработчик перезаписывает значение undefined в своем javascript, тогда jQuery проигнорирует его и установит его собственную переменную undefined, которая никогда не передаёт значение (см. self-executing (jQuery) at конец) и, следовательно, фактически undefined.