`
epy
  • 浏览: 324724 次
  • 性别: 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));

都是可行的。

分享到:
评论

相关推荐

    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 起泡和捕捉--浏览器的...

    teslo:Lisp 方言

    用 JavaScript 编写,在 Node.js 和浏览器上运行 特征 特斯拉有: 宏 - 读取和运行时 一级功能 数据类型 - 在构造函数参数计数上重载 模式匹配 参数解构 - 在函数参数、let 绑定和匹配表达式中 repl - 带制表符补全...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    02 js之onsubmit事件与组织事件外延 03 DOM节点的增删改查与属性设值 04 正反选练习 05 js练习之二级联动 06 jquery以及jquery对象介绍 07 jquery选择器 08 jquery的查找筛选器 09 jquery练习之左侧菜单 第44章 01...

    testQ:测试 krikowal q 库

    Q nodejs 库的##Test 项目试了几个嵌套nodejs回调的例子尝试使用原始承诺(延期) 也通过在另一个中嵌套承诺来实现(在闭包内启用多个输入) 需要尝试 nbind 方法将范围绑定到正在去节点化的回调。

    (全)传智播客PHP就业班视频完整课程

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    JavaScript高级教程

    第 1 章 JavaScript 是什么...............................................1 3 1.1 历史简述..............................................1 1.2 JavaScript 实现................................................

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    史上最全传智播客PHP就业班视频课,8月份视频

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

Global site tag (gtag.js) - Google Analytics