采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
document.write(1) alert(2)
执行结果是先弹出2,点击确认后页面输出1,有几个问题如下,希望您指点
谢谢老师!
需要注意一个区别:
第一,alert(2) 或者 console.log(2) 这种,是不需要浏览器渲染的,直接执行 js 即可得到效果。
第二,document.write(1) 或者 $(document).append($('<div>1</div>')) 是需要浏览器渲染 DOM 的。即执行完了 js ,还要等浏览器把 DOM 节点渲染到页面上,才能被眼睛看到。
另外,还需要注意一个关键:js 执行和 DOM 渲染是公用同一个线程,就在 js 执行时不能同时进行 DOM 渲染,必须等 js 执行结束才能进行 DOM 渲染。
好了,有了以上的知识点,我们再梳理一下这个问题。
第一,开始执行你写的两行代码
第二,执行到 alert(2) ,弹出 2 ,等待用户确认。由于 alert(2) 是同步代码,用户不点击确认,则 js 就没执行结束。js 执行没结束,DOM 就没法渲染。
第三,用户点击 alert 确认之后,js 总算是执行完成了,然后 1 才被渲染到页面上。
总结:其实 document.wirte(1) 早就执行完成了,只是等待 js 执行完成才能被渲染到页面上。
明白了,老师如何做才能让页面显示出1之后,再弹窗提示2呢
把 alert(2) 放在 setTimeout 中
document.write(1) setTimeout(() => {alert(2)}, 0) 老师我这样写的,感觉您的意思是alert(2)先扔到任务队列,等到主执行栈空以后,也就是渲染完事之后再从任务队列取出来执行,所以setTimeout延时是0也没关系,我理解对吗老师?谢谢您!期待您的后续课程!
老师他这个应该是和eventloop有点关系是不是?
document.write(1)执行后行为是dom渲染,而dom渲染和jS公用一条线程是在call stack空闲后才进行dom渲染。
所以要等主线程空了才能渲染。
执行alert(2)
alert()可以阻断js进程,所以alert点了确定才能打印1
event loop 是异步回调的实现方案。这个题目里,有异步吗?
没有异步。。老师所说的js执行结束是否就是call stack空闲
是的。但没有异步,就和 event loop 没关系。只是 js 执行和 DOM 渲染是同一个线程,是互斥的。
登录后可查看更多问答,登录/注册
针对时下面试高频考点,帮助新人js面试快速通关
1.6k 17
1.8k 11
1.3k 11
1.2k 11