分享一道关于闭包、bind和this的面试题


Posted in Javascript onFebruary 20, 2017

要解决的问题是针对下面这个ul,为每一个li添加一个点击事件,弹出对应的index

<ul id="text">
 <li>这是第一个li</li>
 <li>这是第二个li</li>
 <li>这是第三个li</li>
</ul>

解答一:bind,将当前匿名函数指向this,将i当参数传入

var init = function(){
var obj = document.getElementById('text');
for(var i=0;i<obj.children.length;i++){
 obj.children[i].addEventListener('click',function(i){
 alert(i)
 }.bind(this,i))
}
}
init();

解答二:闭包

var init = function(){
var lis=document.querySelectorAll("#text li");
 for(var i=0;i<lis.length;i++){
 lis[i].onclick=(function(i){
  return function(){
   alert(i);
  };
 })(i)
 }
}
init();

解答三:最笨的方法,匹配

var init = function(){
 var obj = document.getElementById('text');
 for(var i=0;i<obj.children.length;i++){
 obj.children[i].addEventListener('click',function(item){
 var self = item.target;
 for(var j=0;j<obj.children.length;j++){
 if(self == obj.children[j]){
  alert(j);
 }
 }
 })
 }
}
init();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JS面向对象、prototype、call()、apply()
May 14 Javascript
jQuery操作Select的Option上下移动及移除添加等等
Nov 18 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
May 11 Javascript
javascript中var的重要性分析
Feb 11 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
jQuery插件扩展操作入门示例
Jan 16 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
浅谈vuex actions和mutation的异曲同工
Dec 13 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
JS左右无缝轮播功能完整实例
May 16 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
May 14 Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 Javascript
原生JS实现跑马灯效果
Feb 20 #Javascript
js 实现省市区三级联动菜单效果
Feb 20 #Javascript
js事件冒泡与事件捕获详解
Feb 20 #Javascript
关于ES6的六个小特性(二)
Feb 20 #Javascript
JavaScript 总结几个提高性能知识点(推荐)
Feb 20 #Javascript
JS批量替换内容中关键词为超链接
Feb 20 #Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 #Javascript
You might like
js Flash插入函数免激活代码
2009/03/31 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
node实现基于token的身份验证
2018/04/09 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
python 读取.nii格式图像实例
2020/07/01 Python
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
为什么需要版本控制
2016/10/28 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
亚运会口号
2014/06/20 职场文书
说谎欺骗人检讨书300字
2014/11/18 职场文书
中班下学期个人总结
2015/02/12 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
字节飞书面试promise.all实现示例
2022/06/16 Javascript