2010-12-16 1 views
2

Это JQuery кодЧто это за непонятный синтаксис JavaScript?

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

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

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

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

EDIT:

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

+0

Это не код jQuery, это код JavaScript. :) – epascarello 2010-12-16 23:57:09

ответ

3

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

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

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

Возьмем такой пример:

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

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

5

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

Ваш первый пример: Immediately-Invoked Function Expression (IIFE). Он создает замыкание вокруг локально определенных переменных.

В следующем примере указывается функция, выполняемая при DOM is fully loaded. Он используется для обеспечения того, чтобы все узлы элементов в 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! 
+0

Пример вашего кода можно упростить следующим образом: `jQuery (function ($) {});` – 2010-12-17 00:20:18

+0

@ Šime Vidas обновил мой пример, чтобы сделать более понятным, почему я буду делать это таким образом. – Stephen 2010-12-17 00:24:13

2

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

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

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

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

является:

$(function() { 
}); 

, который делает то же самое.

В то время как это:

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

часто пишется как:

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

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

3
$(document).ready(function() { 

}); 

эквивалентно следующему:

$(function() { 

}); 

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

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

alert(x); // undefined 
1

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


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

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

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

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