javascript - 将变量值传递给 JavaScript 实时事件

标签 javascript events reference

嗯,这是非常基本的,但我无法独自找到答案。所以希望大家能够帮助我。

我试图将一个事件绑定(bind)到一个对象数组,但不知何故传递的变量是最后一个。经过迭代后。

for (var i = 0; i < map_object.length; i++) {
    map_object[i].on('mousedown', function(){
        var x = i;
            setEvent(this, x);
        });
};

function setEvent(data, i){
    console.log(data);
    var x = i;
    console.log(x);
}

数据是按值传递的,因此它总是动态返回,同时(i变量)作为引用传递。

所以当它执行时我总是得到这个结果

data = (some object) {expected result}

i = 9 {unexpected} = map_object.length

我无法确定这是因为 (i) 作为引用传递,还是因为实时事件是在迭代完成后执行的。

on函数来自Fabricjs

最佳答案

我发现 [].forEach 在这些情况下使用起来更加简洁,并且它通过在循环中没有内部函数来减少闭包:

[].forEach.call( map_object, function(ob, i){ // replace loop with forEach
    ob.on('mousedown', function(){
        var x = i;
        setEvent(this, x);
    });
});

function setEvent(data, i){
    console.log(data);
    var x = i;
    console.log(x);
}

对我来说,forEach() 感觉比无作用域 for 循环延迟函数所强加的繁琐内容要少一些“附加”...

编辑:

如果你有 jQuery 或类似的东西,实际上有一个更好的方法来做到这一点而不需要循环:

$("body").on('mousedown', function(){
     var x = map_object.indexOf(this);
     if(x > -1) setEvent(this, x);
});

function setEvent(data, i){
    console.log(data);
    var x = i;
    console.log(x);
}

这做同样的事情,但允许您在初始运行后动态添加/删除项目,这是运行一次的 for 循环和单独的事件处理程序无法做到的。

关于javascript - 将变量值传递给 JavaScript 实时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27369060/

相关文章:

reference - `&str` 可以包含指向 Rust 中程序内存的指针吗?

javascript - 跨域地理位置跟踪

javascript - 停止固定背景图像在特定高度滚动

javascript - 刷新后将项目添加到本地存储时,我丢失了其他项目

actionscript-3 - AS 3.0引用问题

c++ - 调用 : const pointer to pointer 没有匹配函数

javascript - 运行 react native Android 应用程序时出错 - BatchedBridge

vba - 如何检测特定键是否被按下?

c# - 调用事件,h(args) vs EventName?.Invoke()

css - 获取即将到来的 CSS 过渡属性