js核心基础之闭包的应用实例分析


Posted in Javascript onMay 11, 2019

本文实例讲述了js闭包的应用。分享给大家供大家参考,具体如下:

需求:有一个列表,当点击哪一行,则显示当前是第几行。

html代码:

<p>第一行</p>
<p>第二行</p>
<p>第三行</p>

错误js代码示范:

function addHander(nodes){
  for ( var i=0;i<nodes.length;i++) {
    var node=nodes[i];
    node.onclick=function(){
     alert('当前是第'+i+'行');//3 3 3
    }
  }
}
var nodes=document.getElementsByTagName("p");
addHander( nodes);

从逻辑上来看,毫无漏洞,对不对?

但是,当你每次点击的时候,弹出的都是最后一行。

原理:当页面加载完成之后就调用addHandler函数,为每个节点绑定点击事件处理函数,绑定的是匿名函数,但是,这时候node上的匿名函数并没有被调用,所以,当for循环完成之后i已经等于3了,当你点击节点时,调用匿名函数所以弹出的就是3了。

解决方法一:

function addHandler(nodes) {
 function invoke(i) {
   return **function () {
     alert(i+1);
   }**
 }
 for (var i=0;i<nodes.length;i++){
   var node=nodes[i];
   node.onclick=invoke(i);
 }
}
var nodes=document.getElementsByTagName("p");
addHandler( nodes);

原理:当addHandler函数被调用之后,节点同样被绑定了点击事件处理函数,但是,这时后绑定的是invoke函数返回的匿名函数(function (i){ alert (i+1) }),我们可以想象一下,当点击节点时,调用invoke函数返回的匿名函数,并且将i作为参数传过去,这时候这个I则是当前点击节点的索引下标,所以,弹出的应该是i+1;

解决方法二:

function addHandler(nodes){
  for ( var i=0;i<nodes.length;i++) {
    var node=nodes[i];
    node.onclick=**function(j){
    //同样的返回的均为函数,但匿名函数自调用将其激活了
      return *function(){//闭包
        alert(j+1);
      }*
    }(i);**
  }
}
var nodes=document.getElementsByTagName("p");
addHandler(nodes);

原理:

绑定的也是一个匿名函数,但是外层的匿名函数(见粗体)自调用激活了,返回的同样是个匿名函数(见斜体),这个匿名函数则是要等到点击之后才被调用,这时,弹出的同样是当前节点的索引下标+1.

若是感觉自己已经理解,但是又没办法验证,这里有个练习题,可以试试。

function f(){
  var a=[];
  for ( var i=0;i<3;i++) {
    a[i]=function(){
      return i*2;
    }
  }
  return a;
}
var result=f();
document.write(result[0]()+result[1]()+result[2]());
//输出为6  6  6

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery调用asp.net 页面后台的实现代码
Apr 27 Javascript
在js文件中写el表达式取不到值的原因及解决方法
Dec 23 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
Mar 24 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
Oct 26 Javascript
pm2启动ssr失败的解决方法
Jun 29 Javascript
vue下载excel的实现代码后台用post方法
May 10 #Javascript
微信小程序如何再次获取用户授权的方法
May 10 #Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 #Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 #Javascript
vue element中axios下载文件(后端Python)
May 10 #Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
May 10 #Javascript
简单通过settimeout看javascript的运行机制
May 10 #Javascript
You might like
PHP 常见郁闷问题答解
2006/11/25 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
php escape URL编码
2008/12/10 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
python中pip的安装与使用教程
2018/08/10 Python
python列表使用实现名字管理系统
2019/01/30 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
留学经费担保书
2014/05/12 职场文书
合作协议书格式
2014/08/19 职场文书
计划生育证明书写要求
2014/09/17 职场文书
质检员岗位职责范本
2015/04/07 职场文书
清明扫墓感想
2015/08/11 职场文书
六五普法学习心得体会
2016/01/21 职场文书
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript