`
epy
  • 浏览: 326084 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

给多个节点绑定事件时遇到了JS闭包问题

阅读更多

下面的程序想实现功能:创建 10 li 节点,添加到 id="ulist" ul 中,当鼠标经过每个 li 节点时,就在显示区添加一句 pass + (li 节点的标号 )

<ul id="ulist"></ul>

<div id="show"></div>

<script>

dojo.addOnLoad(function() {

       for(var i=0;i<10;i++){

              var a = dojo.doc.createElement("li");

              a.innerHTML = "item " + i;

              dojo.connect(a,"mouseover", function(){

show.innerHTML = show.innerHTML + "<br/> pass " + i;

} );

              ulist.appendChild(a);

       }

});

</script>

 

上述代码并没有达到要求,鼠标经过任一个 li 节点时,显示区就多一句 “pass 10”

问题出在给 mouseover 绑定的响应函数上,当鼠标经过任一个 li 节点时,就去执行代码中的匿名函数

function(){

show.innerHTML = show.innerHTML + "<br/> pass " + i;

}

i 源于该匿名函数定义时所在的环境,在该环境中 i 的值随着 for 循环从 0 增长到 10 ;到后来匿名响应函数执行时, i 的值是 10 ,而不是像期望的那样去反映 li 的标号。

修正方法:给每个 li 绑定一个新建的函数,新建的函数中使用的变量不依赖 i 。将代码中的蓝色部分改为

              function getFun(k){

                     return function(){ show.innerHTML = show.innerHTML + "<br/> pass " + k;}

              }

              dojo.connect(a,"mouseover", getFun(i));

或者合并为

dojo.connect(a,"mouseover", (function(k){

                     return function(){ show.innerHTML = show.innerHTML + "<br/> pass " + k;}

                     })(i));

都是可行的。

分享到:
评论

相关推荐

    用js闭包的方法实现多点标注冒泡示例

    通过上述代码和分析,我们可以看到,利用js闭包实现的多点标注冒泡功能,可以有效地为地图上的多个标注点提供独立的事件响应,并且允许访问外围作用域的数据,从而实现动态、交互式地图应用。在实际开发中,这种技术...

    js动态添加事件.txt

    然而,在某些场景下,比如根据用户的操作动态生成DOM节点或更改DOM结构时,就需要使用JavaScript动态地为元素添加事件监听器。这种方式更加灵活且易于管理。 #### 二、基本概念与原理 ##### 1. 动态添加事件的方式...

    网页核心四元素内存使用及回收.pdf

    但是,闭包会保持对外部环境的引用,如果DOM节点没有正确解除事件绑定,闭包会成为内存泄漏的一个原因。 2. 图片元素的内存占用及回收 图片元素是网页中常见的资源,它们的内存占用主要由图像数据决定。加载的图片...

    JS.HW-某公司招聘JS程序员的上机题.rar

    这份试题可能包括了JavaScript的核心概念、DOM操作、事件处理、AJAX异步通信、闭包、作用域链、面向对象编程等多个方面。 1. **JavaScript基础知识**:JS是一种基于原型的弱类型语言,它允许动态类型,并且提供了...

    经典效果js源码,希望对大家有帮助

    综上所述,经典效果的JS源码涵盖了JavaScript语言基础、DOM操作、事件处理、动画实现、库与框架应用、面向对象编程等多个知识点。熟练掌握这些内容,不仅能够帮助开发者创造出引人入胜的网页交互,也能提升整体的...

    javascript文件

    这个“white_js_data”压缩包中的8000多个js文件,可以用来研究各种实际应用场景下的JavaScript代码,理解不同开发者对于同一问题的不同解决方案,学习最佳实践,以及查找和分析潜在的性能优化点。通过深入分析这些...

    JavaScript 45道面试题和答案.docx

    JavaScript 是一种广泛应用于 Web 开发的脚本语言,它的面试题涵盖了多个核心概念。以下是根据提供的部分内容解析的一些关键知识点: 1. **闭包**:闭包是指一个函数能够访问并操作其外部作用域的变量,即使在其...

    JavaScript实用知识库分享

    本篇文章将详细介绍JavaScript的实用知识库,涵盖了JavaScript的基础知识、Ajax、DOM操作、事件处理、数据存储、异步编程、正则表达式、ES6、回调函数、Web API、动画库、设计模式等多方面的知识点。 JavaScript...

    最新前端面试题

    6. 线程和进程的区别是线程是最小的执行单元,进程是最小的资源管理单元,一个线程只能属于一个进程,而一个进程可以有多个线程。 7. 服务器集群负载均衡原理是使用增加服务器数量来进行横向扩展,使用集群和负载...

    JavaScript王者归来part.1 总数2

     13.2.2 事件的绑定   13.2.3 直接调用事件处理函数   13.2.4 事件处理函数的返回值   13.2.5 带参数的事件响应及其例子   13.2.6 “this”关键字   13.3 标准事件模型   13.3.1 起泡和捕捉--浏览器的...

    javascript 文档

    8. **错误处理和调试(Error Handling and Debugging)**:有效的错误处理能确保程序在遇到问题时优雅地失败。学会使用`try...catch`语句,理解堆栈跟踪,并熟悉开发者工具的调试功能,将极大地提高开发效率。 9. *...

    JavaScript介绍.zip

    总的来说,JavaScript是一门功能强大、应用场景广泛的编程语言,不仅限于前端开发,还可以延伸到后端、移动应用、物联网等多个领域。无论你是初学者还是经验丰富的开发者,JavaScript都能提供广阔的学习和发展空间。...

    锁游戏JavaScript源代码.zip

    总结,《锁游戏JavaScript源代码》涵盖了JavaScript的基础知识、DOM操作、事件处理、对象和类、异步编程等多个方面,对于学习和提升JavaScript编程技能具有很好的实践价值。通过分析和理解源代码,开发者不仅可以...

    javaScript面试题

    在处理浏览器兼容性问题时,例如IE与标准浏览器的区别,通常需要使用条件语句或特性检测来确保代码在所有浏览器中都能正常运行。例如,获取元素样式,IE与标准浏览器的写法不同,可以通过条件语句或`...

    很多的JS代码,给大家分享

    熟练掌握DOM选择器、节点操作和事件绑定等技能,是成为JS开发者的必备条件。 4. **事件处理**: JavaScript可以响应用户的交互,如点击、滚动、鼠标悬停等。理解事件模型(捕获/冒泡)和事件委托等策略,能帮助...

    js常见经典面试题汇总

    - **节流(throttle)**:每隔一段时间执行一次函数,即使这段时间内有多个触发事件。 #### 12. 事件循环机制 JavaScript的执行机制基于事件循环(Event Loop),主要包括以下阶段: - **执行栈**:同步任务的...

    javascript教程打包(原创)1

    它最初设计用于网页浏览器中,以实现动态网页交互,但随着时间的发展,JavaScript已经广泛应用于服务器端开发(Node.js)、移动应用、游戏开发等多个领域。 在JavaScript教程中,首先会介绍基础语法,包括变量声明...

    75个JavaScript面试题集锦

    JavaScript是Web开发中不可或缺的一部分,尤其对于前端开发者...这些只是JavaScript面试中可能会遇到的一部分问题,涵盖范围广泛,包括基础概念、高级特性和最佳实践。熟练掌握这些知识点将有助于你在面试中脱颖而出,

    Javascript 性能优化的一点技巧

    通过上述介绍,我们可以看到,JavaScript性能优化涉及到多个方面,包括变量管理、DOM操作、事件处理、异步编程以及资源加载等。开发者应该根据实际需求选择合适的优化策略,并不断学习新的技术以适应快速发展的前端...

    javascript经典特效---分组选择的实现.rar

    在这个场景中,我们可能会涉及到DOM操作、事件处理、数据管理等多个JavaScript核心概念。 首先,我们需要理解DOM(Document Object Model),它是HTML和XML文档的一种结构化表示。在JavaScript中,我们可以使用DOM ...

Global site tag (gtag.js) - Google Analytics