JavaScript绑定事件时的闭包问题

在写网页的时候,我们经常需要为一组DOM元素绑定同一事件,比如页面上有3个div,我们给他们绑定一个click事件来alert数组letters中和他们序号对应的字母:

 function bindEvent(){
            var letters = [‘A‘,‘B‘,‘C‘];
            var elems = document.getElementById(‘panel‘).getElementsByTagName(‘div‘);
            var len=elems.length;
            for(var i=0; i<len; i++){
                var letter = letters[i];
                elems[i].onclick = function(){
                    alert(letter);
                }
            }
        }

但我们点击每个div,发现alert的都是字母C。
分析:我们绑定的事件就是bindEvent函数的内部函数,因此一次确定的点击,函数才会去真正执行它内部的语句,访问letter,现在这个时候它会去他的外部函数(bindEvent)中去找值,显然这个时候bindEvent早就执行过了,最后letter的值就是C,这样在点击每个div的时候结果就都一样l了。

该如何解决这个问题呢,我们可以尝试使用一个工厂函数,把每次的定值传出闭包

function createFunction(letter){
    return function(){
        alert(letter);
    }
}
function bindEvent(){
    var letters = [‘A‘,‘B‘,‘C‘];
    var elems = document.getElementsByTagName(‘div‘);
    for(var i=0,len=elems.length; i<len; i++){
        var letter = letters[i];
        elem[i].onclick = createFunction(letter);
    }
}

这里再提供一种方法,如果对()操作符、作用域、匿名函数理解得比较好就很容易理解下面这种写法,也就是利用(function(){…})();来隔离作用域或者说闭包嵌套,相当于作了三个匿名函数来做事件的外部函数,在绑定的时候他们就分别寄存了对应的letter

function bindEvent(){
    var letters = [‘A‘,‘B‘,‘C‘];
    var elems = document.getElementsByTagName(‘div‘);
    for(var i=0,len=elems.length; i<len; i++){
        (function(){
            var letter = letters[i];
            elem[i].onclick = function(){
                alert(letter);
            }
        })();
    }
}

相关链接:http://www.qttc.net/201208154.html

时间: 2024-07-30 01:46:39

JavaScript绑定事件时的闭包问题的相关文章

JavaScript 绑定事件时传递数据

var data = { name: 'Ruchee', email: '[email protected]' }; data.handleEvent = function (e) { console.log(this); }; document.getElementById('test_button').addEventListener('click', data, false); 重点:1. 绑定事件时传递数据本身2. 传递的数据中需要定义有一个 handleEvent 方法来负责事件响应

jquery绑定事件时如何向事件函数里传参数

举例子说明: 步骤1:var button=$('<button type="button" class="btn btn-default">提交</button>'); button.bind("click",{menuid:"01"},form_submit); 如上代码所示即是button按钮绑定了click事件,而其对应的函数为form_submit();并传递了参数menuid,其值为01,

JavaScript绑定事件的方法[3种]

要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定"事件处理函数".所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 一. 在DOM元素中直接绑定 一. 在DOM元素中直接绑定这里的DOM元素,可以理解为HTML标签.JavaScript支持在标签中直接绑定事件,语法为:    onXXX="

javascript绑定事件

本质:不同的库或者工具中总是封装了不同的事件绑定形式,但是究其根源,还是IE事件模型和W3C事件模型不同的处理方式 1)W3C事件模型:支持事件捕捉和冒泡 addEventListener('type',function(){},bool) removeEventListener ('type',function(){},bool) 2)IE事件模型:仅支持事件冒泡 attachEvent('type',function(){}); detachEvent('type',fucntion(){}

day51—JavaScript绑定事件

转换学开发,代码100天--2018-05-06 今天学习JavaScript的绑定事件.因为浏览器的原因绑定事件需要考虑兼容性问题. attachEvent     IE浏览器 ,ie9以上事件执行顺序与绑定顺序相同:ie9以下事件执行顺序与绑定顺序相反 btn.attachEvent("onclick",function(){   alert("a"); }); detachEvent btn.detachEvernt("onclick",f

javascript绑定事件addEventListener与attachEvent

1.eleObj.addEventListener(eventName,handle,useCapture); eleObj:DOM元素: eventName:事件名称.注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击事件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等. handle:事件句柄函数,即用来处理事件的函数: useCapture:Boolean类型,是否使用捕获,一般用false: 2.eleObj.at

JavaScript绑定事件跟解绑事件的兼容代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="button" value="按钮" id="bt"/> <input type=

JQuery 绑定事件时传递参数的实现方法

如题,比如我想在$(":text").bind("keyup",funcionName);将当前的文本框作为参数传递给 functionName所代表的函数,应该怎么写?试了一 下$(":text").bind("keyup",functionName(this));这样是不对的! 1.直接在funcionName 里用 this 就是 对 触发时间的元素本身的引用,如果你需要funcionName有更多参数的话,可以这样用:

关于vue ,v-on 绑定事件时,函数名加括号和不加括号的区别

作者:DDFE链接:https://www.zhihu.com/question/55753541/answer/146504270来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 从官方的文档 事件处理器 - Vue.js 中可以看出通过 `v-on` 中既可以执行一段代码.一个方法.内联 JavaScript 语句,根据不同的情况 Vue 会做不同的处理,具体可以从源码中可以看出(2.1.10版本),在编译阶段,会根据抽象HTML语法树生成代码,从 https: