2012-03-07 3 views
56

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

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

Кроме того, я заметил, что другие плагины рекомендованные JQuery и/или других НЕ переходите к неопределенному параметру.

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

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

ответ

68

Есть две причины:

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 так что вы можете проверить «неопределенность» на эту переменную.

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

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

+5

Причина, по которой jQuery использует этот метод вместо 'typeof', заключается в том, что он сжимается намного лучше в javascript-минификаторе. – interjay

+1

Thats true, тем не менее typeof является самым безопасным методом. Вы также можете использовать фальшивый характер неопределенного, который был бы самой короткой проверкой для 'undefined', но затенен наличием других значений фальши. – Christoph

16

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

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

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

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

Таким образом, в случае JQuery:

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

Они проходят в JQuery и присвоить его переменной $ для удобства, но они не проходят второе значение неопределенного параметра, таким образом, не определен воли быть неопределенным.

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

В современных браузерах, undefined не является настраиваемым, незаписываемый свойство согласно ECMAScript 5 specification.

10

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

Смежные вопросы