• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >JavaScript > JS闭包的应用

JS闭包的应用

作者: 字体:[增加 减小] 来源:互联网 时间:2017-08-02

通过本文主要向大家介绍了闭包,函数,javascript等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

需求:有一个列表,当点击哪一行,则显示当前是第几行。
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]()+"<br/>"+result[1]()+"<br/>"+result[2]());
//输出为6   6   6
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解Javascript中的作用域链和闭包
  • JS闭包可被利用的常见场景小结
  • 利用js的闭包原理做对象封装及调用方法
  • javascript闭包功能与用法实例分析
  • 10道典型的JavaScript面试题
  • 图解Javascript——作用域、作用域链、闭包
  • 轻松理解JavaScript闭包
  • 轻松学习Javascript闭包
  • 详解闭包解决jQuery中AJAX的外部变量问题
  • 分享一道关于闭包、bind和this的面试题

相关文章

  • 2017-05-11基于Bootstrap 3 JQuery及RegExp的表单验证功能
  • 2017-05-11JavaScript常用正则函数用法示例
  • 2017-05-11jQuery中的一些小技巧
  • 2017-05-11Angular2-primeNG文件上传模块FileUpload使用详解
  • 2017-05-11js仿小米手机上下滑动效果
  • 2017-05-11从零学习node.js之express入门(六)
  • 2017-05-11jQuery插件ajaxFileUpload使用详解
  • 2017-05-11javascript滚轮事件基础实例讲解(37)
  • 2017-05-11浅谈JS验证表单文本域输入空格的问题
  • 2017-05-11详解Vue2 无限级分类(添加,删除,修改)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈js中function的参数默认值
    • javascript添加前置0(补零)的几种方法
    • js实现3d悬浮效果
    • Bootstrap fileinput组件封装及使用详解
    • jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
    • 详解jquery validate实现表单验证 (正则表达式)
    • JS简单实现获取元素的封装操作示例
    • 利用node.js写一个爬取知乎妹纸图的小爬虫
    • jQuery插件zTree实现的基本树与节点获取操作示例
    • Vue实现双向数据绑定

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有