2012-01-21 3 views
0

Это частично вопрос jquery, но большинство javascript. Я просто не знаю javascript достаточно хорошо, чтобы понять этот код:Понимание этой функции jquery javascript в функции snippet

1 (function() { 
2   $(function() { 
3    //Global ajax progress dialog box 
4    //Simply run $("#ajax-progress-dialog").dialog("open"); script before the ajax post and 
5    //$("#ajax-progress-dialog").dialog("close"); on the ajax post complate 
6    $("#ajax-progress-dialog").dialog({ 
7     autoOpen: false, 
8     draggable: false, 
9     modal: true, 
10     height: 80, 
11     resizable: false, 
12     title: "Processing, please wait...", 
13     closeOnEscape: false, 
14     open: function() { $(".ui-dialog-titlebar-close").hide(); } // Hide close button 
15    }); 
16   }); 
17  })(); 

Я понимаю строки 3-15. На самом деле, я думаю, что я понимаю строки с 2 по 16: это создает анонимную функцию и обертывает ее как объект jquery, правильно? Не уверен, зачем это нужно обернуть, но что более важно, я особенно не понимаю строки 1: открывается с помощью «(функция» и 17: закрывается с «)()». Что это значит?

Кстати, для полноты картины, обратите внимание, что это вызывается следующим образом:.

$ ("# Аякс-прогресс-диалог") диалог ("открыто");

Credit: этот пример из tugberkugurlu

+0

На самом деле, я думаю, вы можете продолжить и удалить строки 1 и 17, так как это то же самое, что и строки 2 и 16. Не знаю, почему они поместили его дважды – Tom

+0

Довольно точно, что это было задано несколько раз , Google «самостоятельно вызывает анонимную функцию». Позвольте мне попытаться найти дубликат. – Anurag

ответ

1

Это самоисполняющаяся функция, в основном она хранит все внутри нее вне глобальной сферы. Разъясняется в потоке: What is the purpose of a self executing function in javascript?

Но в этом примере код, который вы показали, не требуется. Готовый контракт с запросом

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

делает то же точное.

+0

Что было бы иначе, если бы это было просто следующее? Какие переменные/объекты будут иметь больший объем, чем они должны? . '$ ("Аякс-прогресс-диалог #") диалог ({ AutoOpen: ложь, перетаскиваемые: ложь, модальные: правда, высоты: 80, изменяемое: ложь, названия:«Обработка, пожалуйста, подождите ... ", closeOnEscape: false, open: function() {$ (". Ui-dialog-titlebar-close "). Hide();} });' –

+0

И если кто-то может объяснить, как отформатировать код моего предыдущего комментария я был бы признателен. Я помещаю 2 пробела в конце каждой строки, как говорит документ, но это не сработало. –

+0

В вашем вопросе ничего не было бы. $() - сокращение для [готового документа] (http://api.jquery.com/ready/) – epascarello

1

Это в основном создает анонимную функцию и запускает его немедленно. Это полезно для создания закрытия, например для запуска кода с var x, y, z без загрязнения текущей (обычно глобальной) области.

0

Когда $() вызывается с анонимной функцией, данная анонимная функция вызывается после готовности DOM. Это сокращение от $ .ready(). См. http://api.jquery.com/ready/ для получения информации об этом.

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

Редактировать: Kolink прав, это будет использоваться для ограничения области. Однако в этом конкретном примере это, похоже, не имеет никакой пользы.

0

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

Вы можете увидеть примеры, которые проходят в окне и документов параметров, как document ready эквивалент:

(function(document, window) { 
    var closure_test = 'Hello world!' 

    console.log(window.location.href, closure_test); 

})(document, window); 

console.log(closure_test); 

Запуск этого через JS консоли Chrome (или Firebug), и вы заметите, что closure_test доступна внутри закрытие, но не определено вне его.

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

var exClass = (function() { 

    function private() { 
     return 'I am private'; 
    } 

    // return an object of functions or properties we want to expose 
    return { 
     public: function() { 
      return 'I am publicly accessible'; 
     } 
    } 
})(); 

console.log(exClass.public()); 
// I am publicly accessible 

console.log(exClass.private()); 
// object has no method 'private' 

console.log(private()); 
// undefined 

Обратите внимание, как вы не можете получить к функции называется частным, но вы можете использовать один называется общественной().

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