Какова цель передачи в undefined?
Я заметил jQuery
и связанные с ним плагины с ключевыми словами, такие как jQuery.UI
pass undefined
в качестве параметра, в анонимные функции, используемые в их определениях модулей, например:
(function($, undefined) { ... })(jQuery);
В качестве альтернативы я заметил другие плагины, рекомендованные jQuery, и/или другие НЕ пропускают undefined в качестве параметра.
Это, наверное, глупый вопрос, но...
Разве он не всегда будет доступен? Зачем его пропускать? Есть ли какая-то другая цель или трюк здесь?
Ответы
Ответ 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.