Разница между самоисполняющейся функцией jquery и javascript

В чем разница между -

Во-первых:-

(function () {

    var Book = 'hello';

}());

Второе:-

(function () {

    var Book = 'hello';

})();

Первый и второй чем-то похожи в работе..

Третье :-

(function ($) {

    var Book = 'hello';

})(jQuery);

Какой шаблон мне нужно использовать и где в моем коде. Третий шаблон модуля, который я видел, когда читал статью, связанную с backboneJS.

Что я понял из третьего "самоисполняющаяся функция с аргументом "jQuery""....

Кто-нибудь может дать мне некоторое представление о немедленно вызываемых функциональных выражениях (IIFE).

Спасибо !!


person Javascript Coder    schedule 21.10.2013    source источник
comment
@Klaster Спасибо за редактирование, да, это действительно связано с немедленным вызовом функций.   -  person Javascript Coder    schedule 21.10.2013
comment
Почему с тегом backbone.js?   -  person KiT O    schedule 21.10.2013


Ответы (9)


Во всех случаях вы выполняете анонимную функцию. Я думаю, что 1 совпадает с 2. В третьем случае вы передаете jQuery в качестве аргумента. Это делается, когда вы хотите инкапсулировать jQuery в область действия вашей функции.

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

(function ($) {
    //Here jQuery is $
    var Book = $(document.body).text();    

})(jQuery);

//Out of your function, you user jQuery as jQuery (in this example)
var Book = jQuery(document.body).text();
person Jorgeblom    schedule 21.10.2013

Это называется закрытием, чтобы избежать конфликтов с другими библиотеками, такими как mootools, которые используют $. Таким образом, вы можете гарантировать использование $ в этой функции с передачей jQuery в качестве параметра.

(function ($) {
   $(function () { // Here in this block you can use '$' in place of jQuery
    .......
   });
})(jQuery); //<----passing jquery to avoid any conflict with other libraries.
person Jai    schedule 21.10.2013

Немедленно вызываемые функциональные выражения (IIFE) — одна из основных функций JavaScript. Его основная цель — не загромождать пространства имен одноразовыми функциями и переменными.

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

(function(){
  console.log("Hello symfony world!");
}());

Пройдите по этой ссылке

Кроме того, вот полезное пояснительное видео менее чем за 7 минут.

person Neil    schedule 21.10.2013
comment
Хорошее объяснение в предоставленной ссылке !! - person Javascript Coder; 21.10.2013
comment
Ссылка выше битая. Вот исправленная ссылка Введение в IFFE - person Chris22; 26.11.2016

Как указывалось в других ответах, все они являются самостоятельными анонимными функциями или немедленными анонимными функциями.

Третий пример используется для создания псевдонимов для переменных вне функции. Это хороший способ предотвратить конфликты имен и создать код, в котором можно легко изменить модуль, используемый в функции. По сути, это форма внедрения зависимостей.

(function (doc, win, $, myModule) {
    // Code
}(document, window, jQuery, window.MYAPP.myModule));

doc, win, $ и myModule вводятся переменные. С этим шаблоном тривиально изменить любой из внедренных компонентов. Нравится

(function (doc, win, $, myModule) {
    // Code
}(document, window, jQuery, window.MYAPP.myModule2)); //Use myModule2 instead myModule
person Hugo Tunius    schedule 21.10.2013

Как и в любом другом ответе, в третьей функции вы передаете JQuery функции.

Я хотел бы воспользоваться моментом и объяснить, почему первые два одинаковы.

Когда вы создаете функцию, имя этой функции на самом деле является указателем функции. Например, в function foo(){} foo — это указатель на только что созданную функцию (которая объясняет такие вещи, как this ). Вы разыменовываете этот указатель (и, таким образом, выполняете функцию), добавляя круглые скобки в конце имени функции: foo().

Итак, если мы снова посмотрим на этот код, в первом случае вы сначала создадите функцию:

function () {

    var Book = 'hello';

}

И затем вы разыменовываете его, эффективно выполняя функцию: ()

Во втором примере вы заключаете все создание функции в круглые скобки:

(function () {

    var Book = 'hello';

})

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

person MirroredFate    schedule 21.10.2013

Все три примера являются выражениями немедленно вызываемой функции (IIFE).

Единственное отличие состоит в том, что в третьем примере jQuery передается как переменная, позволяющая использовать ее в IIFE, используя соглашение об именах в долларах. например

(function ($) {
  var Book = 'hello';
  $('#bookelement').html(Book);
})(jQuery);
person Andy    schedule 21.10.2013

Все это самоисполняющиеся функции. Теперь дни также известны как немедленно вызываемые функциональные выражения (IIFE).

Первые два точно такие же с немного другим синтаксисом, а третий передает parameter как объект jQuery.

person Gurpreet Singh    schedule 21.10.2013
comment
Я добавил эту информацию, и я знаю об этом.. Вместо этого есть какая-то разница между ними... - person Javascript Coder; 21.10.2013

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

Единственная разница между 3. 1 и 2 одинаковы.

Разница с 3 в том, что вы передаете ссылку на jquery в качестве аргумента. Теперь все функции внутри этой раздражающей функции имеют доступ к jque.

person Jamie Hutber    schedule 21.10.2013

Все это примеры самовызывающейся функции.

Это даст вам четкое представление: -

var my_func = function(){
    var internal_var = "Hello";
    return internal_var;
};

var my_func2 = function(name){
    var internal_var = "Hello";
    return internal_var;
};

var long_var_name = "I can be some object or number or object or array";

var result1 = (my_func());
var result2 = (my_func)();
var result3 = (my_func2)(long_var_name);

console.log(result1, result2, result3);

Используя этот пример, вы можете сравнить его с Первым, Вторым и Третьим методом.

person Deepak Dixit    schedule 22.12.2017