2013-08-27 3 views
7

В некоторых Javascript кода, который использует непосредственную функцию, то есть аргумент window или document как следующее:Каковы различия между следующими двумя javascript-кодами?

(function (window, document) { 
    ... 
})(window, document); 

Однако window и document глобальные объекты и могут быть доступны непосредственно следующим образом:

(function() { 
    var userAgent = window.navigator.userAgent; 
    ... 
    var el = document.getElementById(...) 
    ... 
})(); 

В чем разница между двумя вышеуказанными кодами. Что лучше и почему?

+1

Это позволяет вам изменять фактические значения 'window' и' document' в пределах этой области; например для Устройства разные вещи. –

ответ

4

Две причины я могу думать:

1) Локальные переменные являются первыми в цепочке областей видимости, поэтому их доступ быстрее, чем глобал (с быстрее я имею в виду незначительно быстрее).

2) Внутри функции window и document являются локальными переменными, поэтому их имена могут быть minimified:

(function (w, d) { 
//var userAgent = w.navigator.userAgent; 

)(window, document); 
-1

Разница полиморфизм: в первом случае, вы могли бы передать функции любой пары объектов которые ведут себя как window и объекты document (по крайней мере, для методов, которые вызовут ваши функции), и функция будет работать с ними.

На практике, с этими двумя объектами, в частности, это более подвержен ошибкам, что любая польза - каждый ожидает window и documentбытьwindow и document определяется JavaScript. Но теоретически это выигрыш.

+0

* «больше подвержено ошибкам» * Я не понимаю, почему это должно быть. Мне кажется более надежным: если вы запускаете скрипт в среде, которая не имеет «окна», вы можете поменять ее, изменив только одну строку.Утиная печать - это функция динамически типизированных языков, а не слабость. –

+0

Если вы ожидаете, что 'window' и' document' будут _those_ 'window' и' document', мы все знаем, что относительно большая функция с этими переопределенными переменными может привести к ошибкам путем быстрого исправления функции или тому подобного. Они не константы, но можно ожидать, что они будут так себя вести. Я бы назвал их с другим именем - это моя точка зрения. – mgarciaisaia

4

В чем разница между двумя вышеуказанными кодами. Что лучше и почему?

По всей практичности и использованию только в браузерах нет заметной разницы.

При этом очень небольшое увеличение производительности происходит от ссылки на локальные переменные вместо глобальных.

Кроме того, это позволяет гибко обменивать реальный window макетной версией; это может быть полезно во время тестирования и в определенных средах, где некоторые из объектов недоступны и должны быть заменены.

Btw, есть еще один аргумент, который вы могли бы передать, то есть undefined; это выглядит следующим образом:

(function(undefined) { 
    // your code 
}()); 

Вы на самом деле не передать что-нибудь к внешней функции и тем самым вы убедитесь, что undefined не был подделан; такие педантичные люди, как я, были бы только void 0 для этой цели, хотя :)

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