如果JavaScript是单线程的,这是什么?
这是: 按顺序单击link1和link2意味着(对于我来说)link2处理程序的块代码不能在link1处理程序完成之前启动(因为JS是单线程的,系统事件是同步的)如果JavaScript是单线程的,这是什么?,javascript,jquery,Javascript,Jquery,这是: 按顺序单击link1和link2意味着(对于我来说)link2处理程序的块代码不能在link1处理程序完成之前启动(因为JS是单线程的,系统事件是同步的) 那么,为什么要使用console.log(“线程?”)将在2秒后打印?我看它像一根线。而且,它的行为是相同的…单线程?对这里的解释过于全面,无法给出一个简短的答案,之前已经讨论过了。请看这篇精彩的文章: 编辑:因为“Yes!!”:-)没有例外。Javascript是单线程的,但代码执行可以是异步的 执行命令如下: link1 clic
那么,为什么要使用
console.log(“线程?”)代码>将在2秒后打印?我看它像一根线。而且,它的行为是相同的…单线程?对这里的解释过于全面,无法给出一个简短的答案,之前已经讨论过了。请看这篇精彩的文章:
编辑:因为“Yes!!”:-)没有例外。Javascript是单线程的,但代码执行可以是异步的
执行命令如下:
link1 clicked -> link2 clicked -> link1 handler executed -> link2 handler executed -> waiting for less than 2 seconds -> link1 setTimeout event handler logic executed
我想我可以试着总结一下
有一个循环que,计时器在开始/结束时有一个时间进行评估(类似的事情),以进行检查并触发其事件
这似乎是一个愚蠢的答案,但在概念上是正确的
我保证,有了这个概念,您可以在精心制作的while循环中实现自己的版本。只是不要想太多()如果你想在java脚本中使用线程,你可以使用HTML5的WebWorker对象。
请参阅John Resig关于WebWorkers的文章当为link1启动处理程序时,它会运行整个函数,包括setTimeout函数,该函数仅注册运行console.log(“线程?”)
语句的函数。这种情况发生得很快。想象一下,就像你会点燃一支枪一样。你没有开火,你只是准备开火,正在进行2秒倒计时
换句话说,setTimeout函数不会阻止任何其他函数的执行,也不会强制link2等待。就link1的处理程序而言,它完成了它的工作,JavaScript引擎继续执行link2的处理程序,该处理程序也在2000ms事件触发之前完成。JavaScript[作为脚本]是单线程的,但它运行的浏览器可以利用操作系统的多线程功能
如果程序员需要,有多种方法可以使Javascript代码块在多线程环境中运行:
使用setTimeout()
方法,将作为参数传递给它的一块数据块排队
使用ActiveX/Applet/Flash组件:这些组件是在浏览器内运行或作为单独进程运行的本机代码。Javascript可以获得对这些组件的控制,并可以对它们调用方法
此外,所有AJAX调用都是通过ActiveX进行的多线程调用,并支持回调
因此JavaScript是单线程的概念是错误的。。。它限制了用户创建和操作线程。我认为这有助于你
HTML
第一编码
<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>
var按钮=document.body.children[0]
var text=document.body.children[1]
button.onclick=函数(){
警报('在onclick'中)
text.focus()
警报('out onclick')
}
text.onfocus=函数(){
警报('onfocus')
text.onfocus=null/(*)
}
二次编码
<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>
var按钮=document.body.children[0]
var text=document.body.children[1]
/*button.onclick=函数(){
警报('在onclick'中)
text.focus()
警报('out onclick')
}*/
text.onfocus=函数(){
警报('onfocus')
text.onfocus=null/(*)
}
button.onclick=函数(){
警报(1)
setTimeout(函数(){text.focus()},0)
警报(2)
}
link1的处理程序不应该首先启动吗,因为它是序列中的第一个?我问的不是setTimeout的内容,而是console.log(“First”)和事件的实际注册。抱歉,link1的处理程序首先被触发,但被setTimeout方法挂起,所以真正的逻辑最后被执行。太棒了。继续编辑并修正你的答案,我会去掉我的反对票:)嗯……我不相信这个命令!事实上,link2处理程序执行->等待不到2秒->
是真的吗?我认为setTimeout不会等待link2处理程序的完成。它在执行link2处理程序的块代码时启动……顺序绝对正确,很容易测试:这并不能真正回答op提出的问题,但很高兴知道JS引擎在更现代的浏览器中变得越来越先进。异步!=多线程创建文章!当没有其他东西阻止执行时,事件和计时器在两者之间执行。基于此,只有在计划执行时没有其他东西占用线程的情况下,才能保证计时器按时执行。这是一个很好的答案,很好地描述了本例中发生的情况!“换句话说,setTimeout函数不会阻止任何其他函数的执行并强制link2等待”?不link2不等待执行link1的setTimeout!
<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>