`
kgdso
  • 浏览: 87872 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

书上的一个关于闭包的例子的思考

 
阅读更多
从书上看到一个例子:
<div id='t1'> test 1</div>
	<div id='t2'> test 2</div>
	<div id='t3'> test 3</div>
	<script type="text/javascript">
		function addEvent(el, type, fn){
			if(el.addEventListener) el.addEventListener(type, fn,false);
			else if(el.addEvent) el.attachEvent('on'+type,fn);
		}
		var doms = document.getElementsByTagName('div'), len = doms.length;
		for(var i=0; i<len; i++){
			var m = 'you click test '+(i+1);//1
			var callback = function(){alert(m)};//2
			addEvent(doms[i],'click', callback);
		}
 当点击t1,t2, t3的时候,总是会打印出“you click test 3”。书上说因为2处的闭包函数引用了1处的变量,所以导致每次调用的时候闭包内的m值都是用了最后一次赋值的值=“you click test 3”。

我的理解是因为callback里面直接使用了外面for循环里面的一个变量m,所以callback形成了一个闭包,而每次for跑完一个循环,则其内部的m值因为闭包的引用而不会被GC回收,那么下一个循环的时候给m赋值的时候,改变的仍然是上一个循环的m,或者说是上一个m指向的同一个对象。而这个对象在每个循环里面都被闭包引用了。所以3次循环下来3个callback指向的都是同一个对象,因此出现了点击每一个div都出现同样效果的问题。


分享到:
评论

相关推荐

    Grovvy 书籍

    《Grovvy 书籍》是关于Groovy编程语言的一份资源集合,主要包含两部分:一本名为《Thinking in Java Fourth Edition》的电子书及其相关的源码。这本书是Bruce Eckel的经典之作,它不仅深入介绍了Java编程,同时也...

    Algorithms A Functional Programming Approach

    《Algorithms A Functional Programming Approach》是Fethi Rabhi和Guy Lapalme所著的关于函数式编程方法的算法书的第二版,由Addison Wesley出版社于1999年出版。本书的副标题强调了函数式编程范式在算法设计和实现...

    Land of Lisp

    书中还会介绍一些实用的库,比如SLIME(Superior Lisp Interaction Mode for Emacs),这是一个在Emacs编辑器中进行Lisp开发的强大工具。 在解决实际问题方面,书中的例子涵盖了游戏开发、图形编程、人工智能等领域...

    Functional Thinking.pdf

    - **第2章:转变**:本章通过一个具体的例子——数字分类问题——展示了从命令式到函数式的转变过程。包括: - 常见示例:通过一个常见的问题场景引入函数式编程的基本概念。 - 命令式处理:首先介绍了如何使用...

    Structure and Interpretation of Computer Programs

    书中通过一系列的例子和练习,引导读者深入理解程序设计的本质,即如何将复杂的问题分解为简单的组成部分,并通过组合这些部分来构建解决方案。 #### 2. Scheme语言 SICP主要使用Scheme语言作为教学工具。Scheme是...

    Programming Paradigms for Dummies

    《Programming Paradigms for Dummies》一书由Peter Van Roy撰写,旨在为具备一定编程经验的读者提供一个全面且深入的理解编程范式的起点。书中介绍了各种编程范式的基础概念、它们之间的联系以及如何选择合适的范式...

    Metaprogramming.Ruby

    - **Carlo Pecchia**(软件工程师)表示,之前从未找到过关于Ruby对象模型、闭包、领域特定语言(DSLs)定义以及自类(eigenclasses)等概念清晰且有组织的解释,本书通过实际生活中的例子让这些概念变得生动有趣。...

    计算机程序的构造与解释(Structure.and.Interpretation.of.Computer.Programs)中英版

    书中通过例子展示了如何构建和使用抽象过程,以解决实际问题。 4. **环境模型**:解释器的环境模型是理解程序执行的关键。书中解释了变量绑定、作用域以及如何在内存中表示这些绑定,帮助读者理解程序是如何运行的...

    javascrip学习资料.rar

    它采用易于理解的图表和互动例子,使初学者能够快速上手,同时也为有经验的开发者提供了新的视角和思考方式。 书中可能存在的错误可以通过HeadFirstJavaScript_Code-Errata勘误表和源代码.rar来纠正。这个文件包含...

    Functional Programming in C#.pdf

    本书《Functional Programming in C#》不仅是一本关于函数式编程的技术指南,更是一部启发思考的著作。它不仅介绍了C#中的各种函数式编程技术,还引导读者深入思考如何将这些技术融入到日常开发工作中去。无论是对于...

    SICP(计算机体系结构)

    《SICP》不仅是一本教科书,更是计算机科学领域的一座里程碑。它不仅深入浅出地介绍了编程的基本概念和技术,还引导读者思考更深层次的问题,如如何设计和分析算法、如何构建高效的程序等。通过本书的学习,读者可以...

    PenseEmPython:《 Think in Python》一书中的代码

    这本书通过一系列逐步深入的示例,引导读者思考如何用Python来解决问题。"PenseEmPython-main"这个压缩包很可能是这本书中代码示例的集合,包含了书中各个章节的源代码。 在Python编程中,有几个核心概念和关键知识...

    learn-fp-go:在Go中学习函数式编程

    在Go中,`sort.Slice`就是一个很好的例子,它可以接受一个比较函数来对切片进行排序。 2. **闭包**: 闭包是Go中实现函数式编程的关键概念,它们允许函数访问并操作其词法作用域内的变量,即使这些变量在其定义的...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    5.2.1 二次缩放(Quadratic Scaling)的一个例子 5.2.2 具有线性复杂度的算法 5.2.3 指数和超指数复杂度 5.2.4 次线性(sublinear)复杂度 5.2.5 常量复杂度 5.2.6 复杂度的技术定义 5.2.7 复杂度的比较 5.3 ...

    SICP:SICP解决方案

    7. **计算几何和物理模拟**:书中还引入了计算几何和物理模拟的例子,展示了如何将抽象概念应用到实际问题中。 在"压缩包子文件的文件名称列表"中,我们看到"SICP-master",这很可能是一个包含SICP解决方案源码的...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    5.2.1 二次缩放(Quadratic Scaling)的一个例子217 5.2.2 具有线性复杂度的算法218 5.2.3 指数和超指数复杂度218 5.2.4 次线性(sublinear)复杂度219 5.2.5 常量复杂度219 5.2.6 复杂度的技术定义220 5.2.7 复杂度...

    sicp:关于SICP的我的个人笔记,解决方案,想法等。

    8. **复杂数处理**:书中通过复杂数的例子,展现了如何扩展基础数据类型和运算符,以支持更高级的数学计算。 9. **流与惰性计算**:SICP引入了流的概念,用于处理无限序列和实时计算。笔记将探讨如何实现和使用惰性...

Global site tag (gtag.js) - Google Analytics