【原】如何在jQuery中实现闭包
原生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中实现闭包的更多相关文章
- jQuery中的闭包和js中的闭包总结
关于闭包的知识总结下: 一.闭包 1.定义 闭包的关键是作用域,概念是:能有读取其他函数内部的函数 使用的场景有很多,最常见的是函数封装的时候,再就是在使用定时器的时候,会经常用到; //闭包:有参数 ...
- 【原】理解javascript中的闭包
闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 什么是闭包? 官方说法: 闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见 ...
- 【原】理解javascript中的闭包(***********************************************)
阅读目录 什么是闭包? 闭包的特性 闭包的作用: 闭包的代码示例 注意事项 总结 闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术.下来对其进行一个小小的总结 回到顶 ...
- 如何在jQuery中使用 setInterval,setTimeout
当遇到setInterval,setTimeout与jquery混用的问题 时,直接按JavaScript中的语法写并不起作用,有以下两种解决方法. 方法1. 直接在ready中调用其他方法,会提示缺 ...
- 如何在js或者jquery中操作EL表达式的一个List集合
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先说明此篇博客看明白了可以干嘛: 就是在js或者jquery中操作一个EL表达式的一个list集合或者复杂类型 ...
- JQuery中的工具函数总结
前提引入 前提当然也是要引入Jquery啦... <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js" typ ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- jquery中的ajax参数说明
本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...
- 难道这就是JavaScript中的"闭包"
其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...
随机推荐
- ashx文件不能使用DAL和Model的解决办法
好久没有写web程序了,今天在写web程序时,发现一个问题,在ashx文件中,已经using了DAL和Model命名空间,而且引用中也引用了程序集,可是还报错:未能找到类型或命名空间"Mod ...
- 黄聪:解决Web部署 svg/woff/woff2字体 404错误
问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...
- Vmware workstation 11 安装 RedHat 9 时 第二个iso文件 出现光盘无法被挂载
通过虚拟机装linux系统,RedHat 9有3个iso文件,安装第一个iso文件时很顺利,安装完成第一个iso文件后,提示请插入光盘 需要继续安装第二个和第三个iso文件,点击菜单栏——虚拟机——设 ...
- c# MessageBox 用法大全
我们在程序中经常会用到MessageBox. 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. 2.MessageBox.Show(&qu ...
- maven详解之生命周期与插件
Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...
- CRM 2016 自定义对话框
项目背景: CRM表单在操作时会有一些提示,或者交互的对话框. 直接 使用js的alert 和 confirm,网格上有些不协调. 以前在项目中使用过jquery 的,但是CRM官方不建议使用jqu ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- 浏览器缓存相关的Http头介绍:Expires,Cache-Control,Last-Modified,ETag
转自:http://www.path8.net/tn/archives/2745 缓存对于web开发有重要作用,尤其是大负荷web系统开发中. 缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中 ...
- CentOS7:Puppet推送Zabbix Agent
创建zabbix模块目录: $ mkdir -p /etc/puppet/modules/zabbix/{manifests,templates} 创建init.pp清单: $ cat /etc/pu ...
- 从高处理解android与服务器交互(看懂了做开发就会非常的容易)
今天帮一个朋友改一个bug 他可以算是初学者吧 .我给他看了看代码,从代码和跟他聊天能明显的发现他对客户端与服务器交互 基本 不是很了解.所以我花了更多时间去给他讲客户端与服务器的关系.我觉得从这个高 ...