js 任务队列?

<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,4,4,4,原题目下各种解释,看着有点乱。
因为看到了这张图onclick在任务队列中,我应该没理解错吧。bg2014100802.png
而我的想法是:这是不是跟js运行机制的任务队列有关,onclick事件添加到任务队列中,等到执行栈中的任务结束之后再执行任务队列中的任务,这样for循环已经结束,故输出了4个4.不知道这样理解对不对?
附上题目链接:https://www.nowcoder.com/ques...

阅读 3.1k
3 个回答

理解没问题
点击事件也属于异步队列 必须等主js任务结束并且空闲时才会调用
闭包解决问题

elements[i].onclick=(function(i){
       return function(){
           alert(i);
       }
   })(i)

对的,当你的点击事件执行的时候循环早已经执行完成了,所以那个时候i也就为4了。

楼主从js任务队列理解是对的,我想补充一下,除了楼主说的js任务队列外,当执行到click的回调函数时,由于js没有块级作用域,此时的i属于全局变量,回调函数当前作用域中访问不到i变量,就会利用作用域链向上查找,直到找到父环境中的变量i,如果到最顶层的全局作用域中还是没有找到i,则为undefined。我前一段时间也一直在去理解这些概念,写了一篇笔记记录 https://segmentfault.com/a/11...,希望能对楼主有所帮助

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题