先看一下代码:
07 |
var a=document.getElementsByTagName('li'); |
08 |
for(var i=0,l=a.length;i<l;i++){ |
09 |
a[i].onclick=function(){ |
一个最经典的例子,上面的代码无论点击哪个结果都为最后的值,因为click事件接收的函数形成了一个闭包,闭包里的i只是对外部函数中变量i的引用,当fn执行完毕时变量i是循环得出的最后的值,闭包内的变量i也就是这个值了,所以不会依次弹出1,2,3。
至于解决的方法:
1. 为遍历的每个元素添加自定义属性用来保存当前的索引值。
2 |
var a = document.getElementsByTagName("li "); |
3 |
for( var i=0; i<a.length; i++ ) { |
5 |
a[i].onclick = function() { |
2. 将当前索引值保存到匿名函数自身。
2 |
var a = document.getElementsByTagName("li"); |
3 |
for( var i=0; i<a.length; i++ ) { |
4 |
(a[i].onclick = function() { |
5 |
alert(arguments.callee.i); |
3. 加一层闭包,将当前索引值以函数参数形式传递到内部函数。
02 |
var a = document.getElementsByTagName("li"); |
03 |
for( var i=0; i<a.length; i++ ) { |
05 |
a[i].onclick = function() { |
4. 加一层闭包,将当前索引值以变量形式传递到内不函数。
02 |
var a= document.getElementsByTagName("li"); |
03 |
for( var i=0; i<a.length; i++ ) { |
05 |
var index = i;//调用时局部变量 |
06 |
a[i].onclick = function() { |
5. 加一层闭包,返回一个函数作为响应事件。
02 |
var a = document.getElementsByTagName("li"); |
03 |
for( var i=0; i<a.length; i++ ) { |
04 |
a[i].onclick = function(arg) { |
05 |
return function() {//返回一个函数 |
6. 利用Function对象,需要注意的是Function构造函数是在脚本运行时创建函数并将参数用作新函数的参数,所以相对前几种方法执行效率较低。
2 |
var a = document.getElementsByTagName("li"); |
3 |
for( var i=0; i<a.length; i++ ) { |
4 |
a[i].onclick = Function('alert('+i+')') |
7. 利用Function对象实例来产生闭包。
2 |
var a= document.getElementsByTagName("li"); |
3 |
for( var i=0; i"a.length; i++ ) { |
4 |
a[i].onclick = new Function('alert(' +i+' )' );//new一次就产生一个函数实例 |
- JavaScript闭包(Closure)
JavaScript闭包(Closure) 本文收集了多本书里对JavaScript闭包(Closure)的解释,或许会对理解闭包有一定帮助. <你不知道的JavsScript> Java ...
- javascript闭包函数
JavaScript中的匿名函数及函数的闭包 1.匿名函数 2.闭包 3.举例 4.注意 1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没 ...
- Javascript闭包和C#匿名函数对比分析
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...
- 理解JAVASCRIPT 闭包
最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念“闭包”. 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这 ...
- 转:深入理解JavaScript闭包概念
闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这样的基本概念理解较好的话,理解闭包的 ...
- JavaScript 闭包整合
初遇闭包感觉很困惑,上网查看了些许介绍,有很多没看懂,就想先对能懂的东西整整 首先觉得要了解闭包,要先对一.JavaScript的变量作用域和作用域链有基本了解 1.变量的作用域分为:全局变量和局部变 ...
- javascript进阶——面向对象特性
面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...
- JavaScript闭包的一些理解
原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...
- javascript闭包1
javascript闭包 在学习javascript闭包之前,需要先了解一下"作用域链". 每一段javascript代码都有一个与之关联的作用域链(scope chain),这个 ...
随机推荐
- <cassert>
文件名: <cassert> (assert.h) 这是一个C语言的诊断库,assert.h文件中定义了一个可作为标准调试工具的宏函数: assert ; 下面介绍这个宏函数:asser ...
- 加油吧 骚年QAQ
本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2017 年 11 月 08 日 原地址:https://niaobulashi.com/archives/fighting.html --- 想 ...
- 牛客网暑期ACM多校训练营(第五场):F - take
链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...
- 《Git学习指南》学习笔记(二)
第三章 提交究竟是什么 每次提交都会生成一个40位的散列值.只要知道散列值,我们就可以恢复到该次提交,这个操作也被称之为检出(checkout)操作. 访问权限与时间戳 Git会保存每个文件原有的访问 ...
- html+css基础 - 个人备忘录
//======================html部分===================// 表现内容<meta http-equiv="Content-Type" ...
- C#2d命令行小游戏
[ 星 辰 · 第 二 条 约 定 ] 要求 空地:空格 | 边界/墙:'█' | 人物:'♜' 实现人物的上下左右移动 记录关系图.流程图.设计过程遇到的问题及解决 项目压缩包 [项目源码](htt ...
- java连接数据库的两种方法总结
方法一:使用jdbc-odbc桥连接sql server,作为中间媒介连接数据库 1.配置数据源:打开控制面版->管理工具->数据源(ODBC)->选用户DSN,按下添加按钮-> ...
- Web后台任务处理
文章:.NET Core开源组件:后台任务利器之Hangfire Hangfire官网介绍:在.NET和.NET Core应用程序中执行后台处理的简便方法.无需Windows服务或单独的过程. 以持久 ...
- 201621123034 《Java程序设计》第5周学习总结
作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:关键字:接口.继承.多态 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般 ...
- LoadRunner数据库监控指标
SQL Server 注:以下指标取自SQL Server自身提供的性能计数器. 指标名称 指标描述 指标范围 指标单位 1.SQL Server中访问方法(Access Methods)对象包含的性 ...