内存使用率很高,但未显示任何内容。页面不断加载。
<html>
<title>Array</title>
<body onload="myFunction()">
<center>
<p id="demo">This is an array</p>
</center>
<script>
var globe;
var i = 0;
function myFunction() {
var sl = ["a", "b", "c", "d", "d", "e", "f"];
for (i = 0; i < 7; i) {
globe = sl[i];
setTimeout(pk, 50);
}
}
function pk() {
document.write(globe);
i++;
myFunction();
}
</script>
</body>
</html>
有人可以向我解释一下,该脚本中实际上发生了什么吗?
答案 0 :(得分:2)
非正式地,您可以想到所有js代码都在单个线程上执行。 setTimeout(f,n)的作用是在至少n毫秒过去并且该线程处于空闲状态时执行函数f。由于myFunction从不返回,因为它不会在内部递增i,所以该线程永不会变为空闲状态,并且永远不会调用pk。大量的计划调用消耗了内存。
解决此问题时,请记住,pk和myFunction之间也具有相互递归关系,这也会使浏览器产生大量调用,从而使之过载。
答案 1 :(得分:1)
简单的HTML
永远不要使用大量的RAM
,如果发生这种情况,您必须确保有一个JavaScript
代码用于实现引起此问题的交互。
对于您的特殊代码,您的问题肯定是您的JavaScript
代码,您的for
循环写得不好。看到:
for(i = 0;i < 7;i) // the last i must be i++
{
globe = sl[i];
setTimeout(pk,50);
}
在第三个i
循环中,您的循环将无限执行,因此在第三部分中,您必须声明i++
步骤,更改代码,然后您会发现它很棒。
祝你好运
答案 2 :(得分:0)
基本上,为了对上述答案进行一点推断,循环内的变量永远不会增加,因此循环将无限期地运行。
您正在i
函数中递增pk()
,但是该函数永远不会运行,因为您的应用程序会陷入无限循环。
答案 3 :(得分:0)
在循环中添加i ++可以解决问题。
您甚至可以使用
for (items in sl){
//whatever code you want
}
此for ... in循环为您带来的好处是,您可以横向排列任意大小的数组