Ответ 1
Уже есть два ответа, но это мое предположение о недостающем конце кода:
(function ($, window, undefined) {
// ... jquery code...
})(jQuery, window);
Примечание: ожидаются три, но два.
В основном это означает:
- предоставляет закрытую область внутри фигурных скобок, поэтому любая заявленная внутри
var
не видна вне - создает закрытый
$
ярлыкjQuery
, не полагаясь на этот ярлык, заданный глобально (например,jQuery.noconflict()
, возможно, был вызван, и это все равно будет работать) - делает лексическую переменную окна, которая будет означать более быстрый поиск глобальных переменных
- гарантирует, что
undefined
действительно undefined в области между фигурными фигурными скобками, даже если кто-то написал что-то вродеundefined = "now it defined";
в глобальной области видимости, потому чтоundefined
можно реально переопределить (это ошибка язык).
Этот шаблон известен как сразу вызываемая функция или непосредственная функция для короткой или самозапускающей анонимной функции или некоторых других имен. Основная идея состоит в том, что:
(function (x, y) {
// ...
})(1, 2);
или
(function (x, y) {
// ...
}(1, 2));
означает то же самое, что:
function myFunction (x, y) {
// ...
}
myFunction(1, 2);
но без необходимости указывать имя вашей функции и загрязнять пространство имен.
Возвращаясь к вашему вопросу, это не означает $(document).ready()
или что-то в этом роде, но это означает, что вы можете использовать $(document).ready()
внутри вместо jQuery(document).ready()
, даже если $
ярлык недоступен снаружи.
Этот пример может действительно объяснить это лучше, даже если он нигде не используется:
(function (JQ, window, undefined) {
JQ(document).ready(function () {
// this is run when document is ready
});
})(jQuery, window);
Теперь вместо $
вы можете вызвать jQuery как JQ
и использовать JQ(document).ready()
вместо $(document).ready()
- это может показаться не очень полезным, но оно показывает, что происходит, когда у вас есть такой код.
В качестве дополнительной заметки я мог бы добавить, что благодаря этому шаблону на самом деле вам не нужны объявления переменных на языке, а только аргументы функции. Вместо:
var x = 10;
alert(x * x * x);
вы можете использовать:
(function (x) {
alert(x * x * x);
})(10);
и действительно такая функция:
function square (x) {
// some code ...
var result = x * x;
return result;
}
в точности эквивалентно:
function square (x, result) {
// some code ...
result = x * x;
return result;
}
из-за механизма подъема в JavaScript, который сделает доступную переменную result
(но undefined) еще до объявления и назначения в обоих случаях (в части // some code ...
). Это часто является источником путаницы, но на самом деле довольно интересно и чрезвычайно мощно.
См. также мой другой недавно обновленный ответ на вопрос: Чтобы узнать больше об этой теме, обратитесь к методам борьбы с глобальными методами борьбы с бедствиями.