2012-04-12 2 views
2

Я (пере) обучения Ajax с сайта Mozilla на https://developer.mozilla.org/en/AJAX/Getting_Started, и я столкнулся с этим сегментом кода:Что (функция() означает в данном сегменте кода

(function() { 
    var httpRequest; 
    document.getElementById("ajaxButton").onclick = function() { 
     makeRequest('test.html'); 
    }; 

    function makeRequest(url) { 
     if (window.XMLHttpRequest) { // Mozilla, Safari, ... 
      httpRequest = new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { // IE 
      try { 
       httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try { 
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e) {} 
      } 
     } 

     if (!httpRequest) { 
      alert('Giving up :(Cannot create an XMLHTTP instance'); 
      return false; 
     } 
     httpRequest.onreadystatechange = alertContents; 
     httpRequest.open('GET', url); 
     httpRequest.send(); 
    } 

    function alertContents() { 
     if (httpRequest.readyState === 4) { 
      if (httpRequest.status === 200) { 
       alert(httpRequest.responseText); 
      } else { 
       alert('There was a problem with the request.'); 
      } 
     } 
    } 
} //missing closing bracket added by bwalton 5/11/11. )(); 

While Мне удалось понять код и заставить его работать, но только после того, как я отключил функцию «(function() {» наверху и все конечные фигурные скобки в конце этого сегмента кода. Дело в том, что я не понимаю цель "(функция {", и, похоже, она не является FF (она не распознает этот сегмент как Javascript до тех пор, пока я не удалил "(function {" parts. Кто-нибудь знает цель этого сегмента кода? знал, что я видел его где-то еще, и на этот раз я хочу точно знать, что это значит.

Заранее за вашу помощь.

ответ

2

(function() { /* code here */ })(); создает анонимную функцию и выполняет ее на месте. Одна из целей - создать локальную область.

7

Это:

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

создает функцию и вызывает его немедленно, с его собственной области. Общим термином для этого является IIFE - «сразу вызываемое функциональное выражение».

В этом случае вы случайно объединили последние две строки, поэтому комментарий в одной строке, в котором упоминается bwalton, нарушил код, удалив завершающий )();.

Без обратной связи () у вас есть ссылка на функцию, но она не вызывается.

Все, что вам нужно сделать, чтобы исправить вашу копию кода, добавляет возврат каретки после bwalton 5/11/11..

+0

Ты одна скобка Короче говоря, не так ли? Стоит отметить, что начальная открывающая скобка и ее закрывающая пара могут быть опущены, но служат как соглашение (как визуальный индикатор), что эта функция будет немедленно вызвана. Они не требуются. Тем не менее, '();' в конце определенно требуется для вызова. –

+0

@ JordanArsenault да - я пропустил один - спасибо! – Alnitak

+0

Большое спасибо, ребята. Ваши комбинированные комментарии помогли мне понять это полностью. Cheers. :) – anthonytwp

0

Увидите, что ()();

Это скобка вызова, привязанная к некоторому значению. Теперь.

(function(){}); 

- функция, анонимная функция, закрытая под скобкой. Добавление все это.

(function(){})(); 

вызов функции, заключенной в круглые скобки. Удивительный!