Вопрос jQuery: что это значит?

(function($, window, undefined){
  ... jquery code... 
})(jQuery, window);

Что это значит? Это также означает $(document).ready()? Или просто две разные вещи?

Ответы

Ответ 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 ...). Это часто является источником путаницы, но на самом деле довольно интересно и чрезвычайно мощно.

См. также мой другой недавно обновленный ответ на вопрос: Чтобы узнать больше об этой теме, обратитесь к методам борьбы с глобальными методами борьбы с бедствиями.

Ответ 2

(function($, window, undefined){
  ... jquery code... 
})();

отличается от

$(document).ready() 

Paul Irish имеет хорошее видео на 10 вещей, которые я узнал из источника jQuery в 1:30, он рассказывает о самоисполнении jquery source анонимная функция и что означают аргументы

Ответ 3

Я предполагаю, что код выглядит примерно так:

(function($, window, undefined){
  ... jquery code... 
})(jQuery, window);

Обратите внимание на скобки в конце.

Если это так, то здесь происходит самозавершаемая анонимная функция. Дело в том, что любой локальные переменные или функции, определенные внутри этой анонимной функции, не будут загрязнять глобальное пространство имен.

Ответ 4

Как будто это совсем не означает (кроме того, закрытие ) отсутствует). То, что вы, вероятно, смотрите на что-то похожее на это:

(function($, window){
    // code
} )($, window);

Это помещает код в новую область, поэтому вы можете, например, определить переменные, не входя в внешнюю область.

Он также позволяет передавать разные вещи функции, не изменяя код. Например, если вы используете разные фреймворки JavaScript, а $ не привязаны к jQuery, вместо этого вы можете передать альтернативную переменную для jQuery, в то время как вы все еще используете $ для ссылки на jQuery внутри. Аналогично этому вы также можете передать другой экземпляр окна (например, из всплывающего окна).