0

Странный синтаксис функции self-invoking closure подразумевает, что вы по существу вызываете функцию, поэтому она делает это self-invoking. Вот код демонстрирует это:

Почему Ajax не использует самоисключение?

<!DOCTYPE html> 
<html> 
    <head> 
     <title> 
      A Nameless Function that Executes Itself 
     </title> 
    </head> 

    <body onload = "mainMethod();"> 

     <div id = "here"></div> 

     <script type = "text/javascript"> 

      function mainMethod() 
      { 
       var here = document.getElementById("here"); 
       var hello = "Hello World!"; 

       here.innerHTML = function() 
       { 
        return hello + "<br />"; 
       }(); // WITH method parentheses -- self-invoking 

       here.innerHTML += function() 
       { 
        return hello; 
       }; // withOUT method parentheses 
      } 
     </script> 
    </body> 
</html> 


... вторая функция выше делает не выполнить, потому что ему не хватает оканчивающиеся круглых скобок, а innerHTML сами становятся всеми функциями. Итак, почему ваш стандартный синтаксис Ajax не использует self-invocation таким же образом? Казалось бы, XMLHttpRequest обрабатывает атрибут onreadystatechange уникальным способом. Вот пример:

function getStock() 
{ 
    var req = new XMLHttpRequest(); 

    var stock = document.getElementById("stock"); 

    req.onreadystatechange = function() 
    { 
     if((req.readyState == 4) && (req.status == 200)) 
     { 
      // value of stock 
      var stockValue = req.responseText; 

      stock.innerHTML = stockValue; 
     } 
    } 
    req.open("GET", "randomStockValue.php?random=", true); 
    req.send(null); 

    setTimeout("getStock()", 1000); 
} 


Обратите внимание на отсутствие прекращения скобки ... Я спрашиваю это потому, что я хочу, чтобы в дальнейшем понять синтаксис Ajax, и что именно он делает.

+0

«Итак, почему ваш стандартный синтаксис Ajax не использует self-invocation таким же образом?» Я не понимаю, что вы имеете в виду, аффект onreadystatechange не использует круглые скобки, поэтому он не должен называть себя. – Sebas

+0

вызов ajax может быть синхронным или асинхронным, если вы пишете req.open (uri, url, false), он будет синхронным, и вы получите свой запас без использования таймаута getStock(), если запрос будет успешным. – mpm

+0

@camus: 'getStock', кажется, использует' setTimeout' только для его повторного вызова, т. Е. В интервале 1s для обновления '# акции'. – Bergi

ответ

0

Он регистрирует прослушиватель событий. Функция не запускается мгновенно, она (объект Function) просто назначается свойству onreadystatechange. Он будет вызываться через некоторое время - когда запрос ajax изменит свое состояние. Это что-то вроде setTimeout с неизвестным таймаутом (и он будет вызываться более одного раза).

+0

Ах, спасибо - так как это прослушиватель событий, он не должен быть самоисполняющимся, а должен быть вызван, когда запрос ajax меняет свое состояние ... что по сути делает его асинхронным, правильным? Кроме того, это «что-то вроде setTimeout с unknonwn timeout» имеет большой смысл, спасибо за помощь. –

+0

Да, это для того, чтобы сделать его асинхронным. – Bergi

3

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

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

Для других примеров прослушивателей событий или функций обратного вызова, которые называются в будущем, см. Методы, такие как addEventListener() или setTimeout().

0

Там нет ничего особенного с обработчиком Ajax вызова, вы можете написать тот же код для первого Exemple, и он будет выполнять то же ожидание:

 function mainMethod() 
      { 
       var here = document.getElementById("here"); 
       var hello = "Hello World!"; 

       here.innerHTML = function() 
       { 
        return hello + "<br />"; 
       }(); // WITH method parentheses -- self-invoking 

       here.innerHTML += function() 
       { 
        return hello; 
       }; // withOUT method parentheses 
      } 

document.body.onload = mainmethod ; 

вам дают 2 exemples то не один и то же контекст, вот почему они ведут себя по-разному.

теперь попробуйте

document.body.onclick = mainmethod ; 

и ваш fonction не будет выполняться, пока не будет нажата кнопка на веб-странице. То же самое для вызова ajax.

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

  • Нет связанных вопросов^_^