【发布时间】:2012-05-17 23:11:53
【问题描述】:
自调用closure 函数的奇怪语法意味着您实际上是在调用函数本身,因此使其成为self-invoking。下面是一些代码演示:
<!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>
...上面的第二个函数 not 执行,因为它缺少结束括号,innerHTML 成为整个函数本身。那么,为什么您的标准 Ajax 语法不以同样的方式使用自调用呢? 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 语法不以同样的方式使用自调用呢?”我不明白你的意思,onreadystatechange 的做作不使用括号所以它不应该调用自己。
-
ajax 调用可以是同步的也可以是异步的,如果你写 req.open(uri, url, false) ,它将是同步的,你会得到你的股票而不需要超时 getStock()如果请求成功。
-
@camus:
getStock似乎使用setTimeout只是为了重复调用它,即每隔1s 更新#stock。
标签: javascript ajax closures parentheses self-invoking-function