这是code:
// link 1 handler. This must finish in any case before link2 starts
$('#link1').click(function () {
console.log("First Handler");
setTimeout(function() {
console.log("Thread???");
}, 2000);
});
// link 2 handler. It starts only when block code of link1's handler finish
$('#link2').click(function () {
console.log("Second Handler");
});
$('#link1').click();
$('#link2').click();
依次单击link1和link2,意味着(对于我understand)link2处理程序的块代码在link1的处理程序完成之前无法启动(因为JS是单线程,系统事件是同步的) )。
那么,为什么console.log("Thread???");
会在2秒后打印出来?我看到它像一个线程。而且,行为也一样......
答案 0 :(得分:6)
单线程?是!!对于这里的简短回答而言,这个解释太过全面,并且之前已经介绍过。看到这篇精彩的文章:John Resig - How JavaScript Timers Work
编辑:因为“是!!”没有例外。 : - )
答案 1 :(得分:5)
当为link1触发处理程序时,它会运行整个函数,包括仅注册运行console.log("Thread???")
语句的函数的setTimeout函数。这很快就会发生。想想这就像你会瞄准枪支一样。你还没有解雇,你刚准备开火并且正在进行2秒的倒计时。
换句话说,setTimeout函数不会阻止任何其他函数的执行,并且(强调添加)不会强制link2等待。就link1的处理程序而言,它完成了它的工作,并且JavaScript引擎继续执行link2的处理程序,该处理程序也会在你的2000ms事件触发之前完成。
答案 2 :(得分:2)
Javascript是单线程但代码执行可以是异步的。
这是执行顺序:
link1 clicked -> link2 clicked -> link1 handler executed -> link2 handler executed -> waiting for less than 2 seconds -> link1 setTimeout event handler logic executed
答案 3 :(得分:1)
我想我可以尝试总结一下。
有一个循环的阙,定时器有一个时刻可以在开始/结束时进行评估(有同样的事情),并检查它们的事件。
这似乎是一个愚蠢的答案,但它在概念上是正确的。
我保证拥有这个概念,您可以在精心设计的while循环中实现自己的版本。只是不要认为它=)
答案 4 :(得分:0)
如果要在java脚本中使用线程,可以使用HTML5的WebWorker对象。 请参阅John Resig关于WebWorkers的文章http://ejohn.org/blog/web-workers/
答案 5 :(得分:0)
JavaScript [作为脚本]是单线程的,但它运行的浏览器可以利用操作系统的多线程功能。
如果程序员需要,有多种方法可以在多线程环境中运行Javascript代码块:
setTimeout()
方法将传递给它的一块块排队作为参数。此外,所有AJAX调用都是多线程的,因为它们通过ActiveX发生并支持回调。
因此,单线程JavaScript的概念是错误的......它限制用户创建和操作线程。
答案 6 :(得分:0)
我觉得这有帮助你!!!!
HTML
<input type="button" value="click me">
<input type="text">
首先编码;
<script>
var button = document.body.children[0]
var text = document.body.children[1]
button.onclick = function() {
alert('in onclick')
text.focus()
alert('out onclick')
}
text.onfocus = function() {
alert('onfocus')
text.onfocus = null //(*)
}
</script>
第二次编码;
<script>
var button = document.body.children[0]
var text = document.body.children[1]
/* button.onclick = function() {
alert('in onclick')
text.focus()
alert('out onclick')
}*/
text.onfocus = function() {
alert('onfocus')
text.onfocus = null //(*)
}
button.onclick = function() {
alert(1)
setTimeout(function() { text.focus() }, 0)
alert(2)
}
</script>