栈溢出??

cqs76 2003-05-19 10:13:01
<html>
<head>
<script type="text/javascript">
function show(obj)
{ obj.style.display="none"
setTimeout(show(obj),5000)
}
</script>
</head>
<body onload="show(d1)">
<div id="d1" display="">
<font color="red">▲</font>
</div>
</body>
</html>

有兴趣的朋友可试试!
...全文
370 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
llrock 2003-05-20
  • 打赏
  • 举报
回复
faint
队列是fifo的,"堆栈是lifo的!",概念混淆:)堆和栈天壤之别呦

偶想不通啥叫set?

事实上,搂住的错误是显而易见的,我只是想说为什么这种错误的使用函数会出现溢出
emu 2003-05-20
  • 打赏
  • 举报
回复
llrock(百乐宝||昨夜星辰) :
js解决setTimeout应该和队列和栈没有深关系。队列是fifo的,堆栈是lifo的,setTimeout是看你set到了什么时候的。

js中函数可视为对象,对函数的引用也可视为指针。


setTimeout("show(d1)",5000)是在5000毫秒后运行“show(d1)”这个语句(表达式)

setTimeout(show,5000)是setTimeout的第二种用法,因为show本身就是一个函数指针(引用),所以被安排在5000毫秒后调用它所指向的函数。

setTimeout(show(d1),5000)是马上运行这“show(d1)”这个表达式后尝试把结果当成函数指针来排队,如果show(d1)能够返回函数指针或者表达式就没问题,像这样(show返回函数):
function show(a){
return new Function("alert(\""+a+"\")");
}
setTimeout(show("hello"),1000);

或者这样(show返回表达式):
function show(a){
return ("alert(\""+a+"\")");
}
setTimeout(show("hello"),1000);

堆栈错误出在楼主在show函数里面的setTimeout语句又递归调用了show函数的执行结果,而不是show函数本身。
emu 2003-05-20
  • 打赏
  • 举报
回复
呵呵老实跟你说,我大学是没学过数据结构,都是初中学的,记不清了。

看看:http://expert.csdn.net/Expert/topic/1808/1808651.xml

我想现在大家说堆栈都是指栈(stack)了。
llrock 2003-05-20
  • 打赏
  • 举报
回复
哈哈哈。搂住会被气死的


每次都是我跟你吵,哈哈哈。肯定是两个概念,可能你没有学过数据结构,那没有关系。

栈约定了一种先进后出的机制,并且由于多采用链表,所以它的容量受到限制,你会遇到栈溢出得问题。他的用途非常的广泛。
堆提供了一种可任意插入和删除机制,确切地说他是一块内存区域,而不是结构。他的用途则在于为系统提供一块可随时使用和释放的空间,不同系统对堆的管理不同,都提供了充分的自由,这也是你会遇到内存泄漏的原因。
这是我的理解,没有照搬书本呦


emu 2003-05-20
  • 打赏
  • 举报
回复
对了,你认为“堆栈”是两个概念吗?
emu 2003-05-20
  • 打赏
  • 举报
回复
呵呵那句话是我说的,不是从哪里看到的。

消息队列我知道。“当一个Timeout消息被post时,进入队列等待系统处理”和我的理解一样。

我的意思是,setTimeout语句运行的时候,并没有把函数或者表达式放进队列或者堆栈,你所说的是timeout消息post之后,这并不矛盾啊。

顺手做了个试验,又发现了IE似乎在setTimeout上也有bug:

setTimeout("alert(3)",1500)
setTimeout("alert(1)",500)
setTimeout("alert(2)",1000)
for (t=(new Date());(new Date())-t<2000;)status=(new Date())-t

试试调整各个setTiemout的顺序看看?

llrock 2003-05-20
  • 打赏
  • 举报
回复
to:emu

你说的那些只是堆的实现,事实上有很多种方式来实现的。不局限于你说的,最好不要从网上找资料,他们大多没有权威性,而且往往错误很多。建议买一本《数据结构》看看,很便宜的。绝对比那些《...技术大权〉之类的垃圾好。有时候问题应该从本质上寻找,我清楚的记得你告诉我的一句话。:)

堆和栈是人们解决问题的两种思想,而非具体的实现过程。

堆 可以任意的添加也可以任意的删除,他表面上是无序的数据块,当然实际的应用中堆是有序的,但是实现的方式不同,内存管理也不同。你经常用到的new object就是用堆实现。

栈 对添加和删除数据做了特殊限制,也存在各种各样的实现方式,对归就使用栈来实现的。


“我说“setTimeout是看你set到了什么时候的”的意思是setTimeout是根据你设置的时间值来决定什么时候调用函数或执行语句(表达式的),跟设置的前后顺序无关。
”这句话不知道你是从哪里看到的,不知道你可知道消息队列,当一个Timeout消息被post时,进入队列等待系统处理,当然和语句的物理位置是无关的,timeout给人的感觉象是一个线程,当然她不是。

JK_10000 2003-05-20
  • 打赏
  • 举报
回复
楼主将setTimeout("show(obj)",5000)
错用成setTimeout(show(obj),5000)
产生栈溢出,很正常啊

加了两句注释后
可以很清楚看清溢出的过程:


<html>
<head>
<script type="text/javascript">
var i=0;
function show(obj)
{ obj.style.display="none";
alert(i++);
if(i>10) return "alert('OK')";
setTimeout(show(obj),5000)
return "alert('"+i+"')";
}
</script>
</head>
<body onload="alert(show(d1))">
<div id="d1" display="">
<font color="red">▲</font>
</div>
</body>
</html>
emu 2003-05-20
  • 打赏
  • 举报
回复

查了下网上:
堆是一个完全二叉树,可以用一维数组来实现。堆中存储的数是局部有序的。有两种不同的堆:最大值堆和最小值堆。最大值堆的任意一个结点的值都大于或等于其任意一个子结点存储的值。

查了下金山,堆:heap,栈,或者叫堆栈:stack。
stack
[stAk;stAk ]
(堆)栈;[堆叠,叠式储存器]
A reserved area of memory where the CPU automatically saves the program counter and the contents of working registers when a program interrupt occurs. The stack normally forces users to return from interrupts in the same order that interrupts occurred.
内存中的一块留用存储区,当程序中断产生时,CPU自动在其中保存程序计数器和工作寄存器的内容。栈通常迫使用户程序以中断发生的同样顺序从中断点返回。
Generally, a block of successive memory locations that are accessible from one end of a last-in/first-out(LIFO) basis. The stack is coordinated with a stack pointer that keeps track of storage and retrieval of each byte or word of information in the stack. A stack may be any block of successive information locations in a read/write memory.
通常情况下,一种连续的存储单元区,从一端按后进先出的原则可对这些单元进行存取。栈和一个栈指针配合工作,栈指针随时指示要存取的每个字或字节信息在栈中的位置。栈可以是读写存储器中任意的地址连续的存储单元块。


堆的概念好像只在堆排序里面见过。而把栈叫堆栈向来如此,不算概念混淆吧?
emu 2003-05-20
  • 打赏
  • 举报
回复
很惭愧,我向来把栈叫做堆栈,至于什么是堆,还真的是不懂,你给讲讲好不?

我说“setTimeout是看你set到了什么时候的”的意思是setTimeout是根据你设置的时间值来决定什么时候调用函数或执行语句(表达式的),跟设置的前后顺序无关。

堆栈溢出是由于无限制的递归调用造成的,我前面应该解释的很清楚了。
llrock 2003-05-19
  • 打赏
  • 举报
回复
我想setTimeout是被放进了队列,其实我也不是很清楚js是利用队列还是使用递归解决setTimeout问题的,至少不是栈,栈好像解决不了时间序列问题。

但是对于函数的参数往往是利用栈来实现的,当你的obj如栈时,由于你传入了一个show(obj),事实上这是一个非法的操作,因为obj并不是一个div对象,只是一个空的指针(至少c中),于是被抛出异常,系统没有及时的或者说无法正常的退栈,于是下一次系统仍就尝试将参数压入相同的栈中,因为你的栈长度只有1,于是会产生栈溢出的问题。

这是我个人的理解。

llrock 2003-05-19
  • 打赏
  • 举报
回复
setTimeout(show,5000)是符合所谓函数指针的用法,但不知道js有无函数指针。
llrock 2003-05-19
  • 打赏
  • 举报
回复
<html>
<head>
<script type="text/javascript">
function show(obj)
{
obj.style.display="none"
setTimeout("show(d1)",5000)
}
</script>
</head>
<body onload="show(d1)">
<div id="d1" display="">
<font color="red">▲</font>
</div>
</body>
</html>
cqs76 2003-05-19
  • 打赏
  • 举报
回复
我的思路是能够让它实现抖动,如接受到了一个信息等时的情景,但是抱错。
其实java脚本我是不太懂的!!
hillhero789 2003-05-19
  • 打赏
  • 举报
回复
<html>
<head>
</head>
<body onload="setInterval('ob.style.display=ob.style.display==\'\'?\'none\':\'\'',50);">
<div id="d1" display="">
<font color="red">▲</font>
</div>
<script type="text/javascript">
ob=document.all("d1");
</script>
</body>
</html>
hillhero789 2003-05-19
  • 打赏
  • 举报
回复
setTimeout("show(obj);",5000)
cqs76 2003-05-19
  • 打赏
  • 举报
回复
<html>
<head>
<script type="text/javascript">
function show(obj)
{ d1.style.display="none"
setTimeout(show(),5000)
}
</script>
</head>
<body onload="show()">
<div id="d1" style="display:''">
<font color="red">▲</font>
</div>
</body>
</html>


我改成这样还是报错???
cqs76 2003-05-19
  • 打赏
  • 举报
回复
那解决的办法呢??
可否讲讲??
emu 2003-05-19
  • 打赏
  • 举报
回复
1:错误
setTimeout(show(obj),5000)
setTimeout的code参数应为函数指针或执行代码字符串。
作为函数指针时无法带参数。作为代码字符串时传递的参数只能是常数或者全局变量。
obj在这里是function的参数变量,在window作用域上没有定义。

2: 错误
<div id="d1" display="">应为<div id="d1" style="display:''">

3: 出错过程解释:
setTimeout(show(obj),5000)在解析的时候发现code参数的值是一个函数调用“show(obj)”,于是脚本引擎试图调用这个函数后获得函数返回的值来作为函数指针传给setTimeout函数。但是在调用过程中再次遇到这个语句,于是再次试图获得函数指针……如果没有堆栈限制的话你就在死循环中死机了。


87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧