Странный синтаксис функции 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, и что именно он делает.
«Итак, почему ваш стандартный синтаксис Ajax не использует self-invocation таким же образом?» Я не понимаю, что вы имеете в виду, аффект onreadystatechange не использует круглые скобки, поэтому он не должен называть себя. – Sebas
вызов ajax может быть синхронным или асинхронным, если вы пишете req.open (uri, url, false), он будет синхронным, и вы получите свой запас без использования таймаута getStock(), если запрос будет успешным. – mpm
@camus: 'getStock', кажется, использует' setTimeout' только для его повторного вызова, т. Е. В интервале 1s для обновления '# акции'. – Bergi