分享一道关于闭包、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 相关文章推荐
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
Jul 31 Javascript
javascript等号运算符使用详解
Apr 16 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
JS插件plupload.js实现多图上传并显示进度条
Nov 29 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
彻底解决 webpack 打包文件体积过大问题
Jul 07 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
angularJs中$scope数据序列化的实例
Sep 30 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
vue单文件组件无法获取$refs的问题
Jun 24 Javascript
Vue组件间数据传递的方式(3种)
Jul 13 Javascript
利用PHP实现递归删除链表元素的方法示例
Oct 23 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
PHP调用三种数据库的方法(2)
2006/10/09 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
js原型链原理看图说明
2012/07/07 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
常用python编程模板汇总
2016/02/12 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
python字符串循环左移
2019/03/08 Python
python aiohttp的使用详解
2019/06/20 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
行政内勤岗位职责
2014/04/07 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python