原生JS中,闭包虽好用,但是很难用好,在jQuery中一样,都有一些点需要我们注意。jQuery中使用闭包的常见情况有以下几种:

1、$(document).ready()的参数

  我们在写jQuery时都会把一系列的函数放在$(document).ready()中,这其实就是一个闭包,这有效避免了命名冲突;

2、绑定事件 

 $(document).ready(function() {
var num = 0;
$("button").click(function(event) {
event.preventDefault();
num++;
console.log(num);
});
});

我们为“button”绑定点击事件,click里的函数就是一个匿名函数,它访问了外部变量,每次访问同一个num实例,多次点击,num值累计加1。

3、循环绑定事件

 $(document).ready(function() {
for (var i = 0; i < 5; i ++) {
$("<button>btn" + i + "</button>")
.click(function() {
console.log(i);
}).insertBefore("#result");
}
});

我们的原意是想生产五个按钮,并为每个按钮绑定一个点击事件,但是上述方案显然是不行的,click事件里传的是一个匿名函数,每次访问的都是i最终的值5。应该这样写:

 $(document).ready(function() {
for (var i = 0; i < 5; i++) {
(function(val) {
$("<button>btn" + val + "</button>")
.click(function() {
console.log(val);
}).insertBefore("#result");
})(i)
}
})

我们创建一个立即调用函数表达式,每一次都将当前的i值传入函数,这样,内部函数就能拿到每次循环当下的i值,而非终值。也可以用each这样写:

 $(document).ready(function() {
$.each([0, 1, 2, 3, 4], function(index, value) {
$("<button>btn" + value + "</button>")
.click(function() {
console.log(value);
}).insertBefore("#result");
});
});

我们都知道.on()方法还接收一个对象参数,当事件被触发是,会有一个对象参数以event.data的形式传给对象处理函数,因此,还可以这么写:

 $(document).ready(function() {
for (var i = 0; i < 5; i ++) {
$("<button>btn" + i + "</div>")
.on("click", {value: i}, function(event) {
console.log(event.data.value);
}).insertBefore("#result");
}
});

以上就是jQuery中处理闭包的方式,另外还要注意命名空间,和JS中道理都是一样的。

【原】如何在jQuery中实现闭包的更多相关文章

  1. jQuery中的闭包和js中的闭包总结

    关于闭包的知识总结下: 一.闭包 1.定义 闭包的关键是作用域,概念是:能有读取其他函数内部的函数 使用的场景有很多,最常见的是函数封装的时候,再就是在使用定时器的时候,会经常用到; //闭包:有参数 ...

  2. 【原】理解javascript中的闭包

    闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 什么是闭包? 官方说法: 闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见 ...

  3. 【原】理解javascript中的闭包(***********************************************)

    阅读目录 什么是闭包? 闭包的特性 闭包的作用: 闭包的代码示例 注意事项 总结 闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 回到顶 ...

  4. 如何在jQuery中使用 setInterval,setTimeout

    当遇到setInterval,setTimeout与jquery混用的问题 时,直接按JavaScript中的语法写并不起作用,有以下两种解决方法. 方法1. 直接在ready中调用其他方法,会提示缺 ...

  5. 如何在js或者jquery中操作EL表达式的一个List集合

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先说明此篇博客看明白了可以干嘛: 就是在js或者jquery中操作一个EL表达式的一个list集合或者复杂类型 ...

  6. JQuery中的工具函数总结

    前提引入 前提当然也是要引入Jquery啦... <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js" typ ...

  7. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  8. jquery中的ajax参数说明

    本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...

  9. 难道这就是JavaScript中的"闭包"

    其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...

随机推荐

  1. win 8 安装 NET framework3.5 方法

    win 8 预装的 NET framework 是 4.5 的,实际上很多程序要求的是 3.5,一般要另从网上下载的才能安装. 这里提供不需要从网上安装 .Net 3.5 的方法: 1.将 win 8 ...

  2. Ubuntu 下安装 SQL Server 2016初探

    安装步骤参官方 https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-ubuntu 执行命令如下: .Enter supe ...

  3. 在vs2012中使用TeeChart空间

      今天下了TeeChart  安装中发现没有VS2012选项 在看了官网回答后  可以 如下解决 1.- Install last maintenance release of 28 Septemb ...

  4. js中使用进行字符串传参

    在js中拼接html标签传参时,如果方法参数是字符串需要加上引号,这里需要进行字符转义 <a href='javascript:addMenuUI("+"\"&qu ...

  5. 【转载】彻底卸载MYSQL的方法

    1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 3.开始->运行-> regedit 看看注册表里这几个地方删除 ...

  6. poj1113

    http://poj.org/problem?id=1113 完全时copy大神给的模版哦,结果再加一个小圆的周长就好啦 #include<stdio.h> #include<mat ...

  7. DES对称性加密

    using System; using System.Security.Principal; using System.Security.Permissions; using System.Secur ...

  8. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  9. Xcode7打包,iOS9真机闪退,如何解决?

    问:有些项目用xcode7打开运行,打包安装到iOS9设备上程序会闪退. 如果用xcode7以下编译,然后打包到iOS9的设备上就是正常的.这是为什么,关键是,怎么解决? 答:iOS9发布之后,有些a ...

  10. Mysql常见四种索引的使用

    提到MySQL优化,索引优化是必不可少的.其中一种优化方式 --索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升. 我们知道项目性能的瓶颈主要是在"查(select)&q ...