链接:https://www.nowcoder.com/questionTerminal/da4115e308c948169a9a73e50d09a3e7
来源:牛客网
今天看到一个题目:
现有如下html结构“
<ul>
<li>click me</li>
<li>click me</li>
<li>click me</li>
<li>click me</li>
</ul>
运行如下代码:
var elements=document.getElementsByTagName('li');
var length=elements.length;
for(var i=0;i<length;i++){
elements[i].onclick=function(){
alert(i);
}
}
依次点击4个li标签,哪一个选项是正确的运行结果(D)?
A. 依次弹出1,2,3,4
B. 依次弹出0,1,2,3
C. 依次弹出3,3,3,3
D. 依次弹出4,4,4,4
js运行机制是单线程的,一个时间点只能处理一个事情,优先处理同步任务,按照代码从上往下执行,一旦遇到异步,就进行挂起,放到异步任务里,继续执行同步任务,只有同步任务执行完了,才看看有没有异步任务,然后再按顺序执行
在这里for循环是同步任务,而onclick是异步任务,当for循环结束时,i的值为4,然后 for循环每执行一次,onclick事件函数都会被挂起一次,共4次; for循环结束后,点击事件 触发了4个onclick函数,接着输出4个4
这题考察了事件渲染的顺序,匿名函数,看评论说其实他是个闭包,因为i是上层链,我也觉得是,闭包只能取得包含函数中任何变量的最后一个值,闭包只能return一个出来,就只能每次return个4出来