Что это за неизвестный синтаксис JavaScript? - PullRequest
2 голосов
/ 17 декабря 2010

Это код JQuery

(function(jQuery){
})(jQuery);

эквивалентно

$(document).ready(function () {
});

Если да, то чем они отличаются? Если нет, то что делает первый?

EDIT:

Спасибо всем. Большинство ответов схожи с разными вкусами и образцом

Ответы [ 5 ]

5 голосов
/ 17 декабря 2010

Они не эквивалентны.

Ваш первый пример - Выражение немедленного вызова функции (IIFE) . Это создает замыкание вокруг локально определенных переменных.

Ваш второй пример определяет функцию, которая будет выполняться, когда DOM полностью загружен . Он используется для того, чтобы все узлы элемента в DOM были доступны до выполнения вложенного кода. Это тоже закрытие.

В обоих примерах используются анонимные функции.

Стоит отметить, что хорошей практикой является использование обоих ваших примеров, например так:

(function($){
    // locally-scoped, DOM-is-NOT-Ready-code here.
    $(function () {
        // your locally-scoped, DOM-is-ready-code here.
    });
}(jQuery)); // note that I've moved the invocation into the parens
            // that contain the function.  This makes JSLint happy!
3 голосов
/ 17 декабря 2010
$(document).ready(function () {

});

эквивалентно этому:

$(function() {

});

Первый фрагмент - это немедленно вызванная анонимная функция, которая создает локальную область:

(function() {
    var x = 2;
})();

alert(x); // undefined
3 голосов
/ 17 декабря 2010

Абсолютно нет, первая - это самозаполняющаяся анонимная функция, а вторая - обработчик ready.

(function(jQuery){
  //jQuery in this scope is referencing whatever is passed-in
})(jQuery);

Таким образом, jQuery внутри функции не обязательното же самое jQuery вне функции.Но обычно вы не хотите смешивать или сопоставлять имена глобальных переменных с локальными.

Возьмите этот пример:

(function(obj) {
   alert(obj);
})('Hello');

Это определяет функцию, затем немедленно вызывает ее, передавая "Hello"

2 голосов
/ 17 декабря 2010

Нет.Первый действительно мало что делает.Просто отделяя любые переменные внутри от окружающей области видимости, и создавая локальную переменную jQuery внутри.

Вторая передает функцию, которая запускается после , когда DOM готов (другими словамипосле загрузки <body>.

Общий эквивалент:

$(document).ready(function () {
});

:

$(function () {
});

, что делает то же самое.

Хотя это:

(function(jQuery){
})(jQuery);

часто записывается как:

(function($){
})(jQuery);

, так что переменная $ больше не является глобальной переменной.Полезно, если глобальная переменная $ уже используется.

1 голос
/ 17 декабря 2010

Совсем нет. Первая - это замыкание - функция, которую вы создаете, а затем сразу вызываете. Тем не менее, как правило, вы бы комбинировали эти два вида так:


  (function($) {
    // use the $ variable
    $(document).ready(function(){
      // ...
    });
  })(jQuery);

Создав замыкание, вы переименовываете «jQuery» в «$» только для этого блока кода. Причина, по которой вы используете синтаксис замыкания, заключается в том, что вы можете использовать переменную $, даже если она не может быть определена как объект jQuery в глобальной области видимости (то есть некоторые JavaScript-инфраструктуры, такие как прототип, используют $ в качестве переменной).

Всякий раз, когда вы пишете плагин jQuery, вы должны заключать весь код jQuery в этот тип замыкания, чтобы он не мешал другим JavaScript-фреймворкам. Если вы не пишете плагины и не используете какие-либо другие JavaScript-фреймворки, вам, вероятно, не нужно беспокоиться о заключении вашего кода в замыкание.

...