因此,为了开始并避免混淆,下面的代码激发了我的想法,除了一个解释我的问题来自何处的示例外,它不一定与我的问题有太大关系。
我只是在这里查看 javascript 中的一些代码:https : //jsfiddle.net/Daniel_Hug/pvk6p/
var h1 = document.getElementsByTagName('h1')[0],
start = document.getElementById('start'),
stop = document.getElementById('stop'),
clear = document.getElementById('clear'),
seconds = 0, minutes = 0, hours = 0,
t;
function add() {
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
}
}
h1.textContent = (hours ? (hours > 9 ? hours : "0" + hours) : "00") + ":" + (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
timer();
}
function timer() {
t = setTimeout(add, .1);
}
timer();
/* Start button */
start.onclick = timer;
/* Stop button */
stop.onclick = function() {
clearTimeout(t);
}
/* Clear button */
clear.onclick = function() {
h1.textContent = "00:00:00";
seconds = 0; minutes = 0; hours = 0;
}
这个人似乎使用递归来制作秒表,在计时器中添加。
如果我递归地执行此操作,则将此函数更改为:
function timer() {
add();
}
它占用堆栈空间,最终中断,在 3:00:00 以下停止。
但是后来我意识到他们在原始代码中使用了 setInterval(),它只是创建一个单独的线程然后结束线程,释放堆栈空间。代码只是重复执行此操作,这就是堆栈似乎没有溢出的原因。
我很难理解的是这是如何在较低级别上工作的?在我参加的一门课程中,我被要求制作自己的内存分配器(我理解它会占用堆空间),但我们从来不必担心线程,我想知道我将如何使用它。
所以假设我有一个线程,然后内核切换到另一个线程,然后另一个线程结束,另一个线程开始,我假设在线程结束和创建之间的堆栈中会有间隙,正确的?。我在另一篇文章(更多与 java 相关,不确定编程语言是否重要)中读到,每个线程在堆栈上都有自己的空间。所以我想知道,每次我创建一个线程时,它是否只是像内存分配器那样填补空白?如果一个线程最终占用了太多空间怎么办?程序是否知道在其他地方重新分配内存?我在想这个错误吗?
Javascript 是单线程的。例如,参见https://stackoverflow.com/questions/13504811。主线程和单个 javascript 线程有一个就绪任务队列和一个定时任务队列。它在第一个队列上循环直到为空,然后在第二个队列上循环直到所有超过时间限制的定时任务都被执行,然后休眠直到新的就绪任务出现,或者一些定时任务的时间到了。
表达式setTimeout(add, .1)
只是将一个任务添加到定时任务队列中。.1
超时后会执行,主线程可以执行下一个任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句