javascript - 与 addEventListener 绑定(bind)

标签 javascript events dom-events addeventlistener

当在 JavaScript 中的事件监听器上使用 bind() 时,我无法再获取带有“this”的元素。

这是我的代码:

function callback(){

     console.log(this.someVar);
     // Works fine

     console.log(this);
     // No longer refers to the element, outputs "Object"

}

callback = callback.bind({someVar: 1234});

element.addEventListener('click', callback);

知道如何解决这个问题吗?

最佳答案

如果您想传递一个变量但保留 this 上下文,那么您可以使用柯里化(Currying)或部分应用:

Curry

您的函数必须接收一个值并返回另一个函数。这样您就可以执行以下操作:

function callback(num) {
  return function() {
    console.log(num);
    console.log(this.id);
  }
}

var number = 1;

document.getElementById("hello").addEventListener("click", callback(number));

//change the variable
number = 2;
document.getElementById("world").addEventListener("click", callback(number));

//change the variable again
number = 3;
<button id="hello">Hello</button>
<button id="world">World</button>

Partial application

同样的想法,但不是让你的回调返回一个新函数,它只需要一个参数并正常工作,你需要另一个函数来执行部分应用程序:

function callback(num) {
  console.log(num);
  console.log(this.id);
}

var number = 1;

document.getElementById("hello").addEventListener("click", partial(callback, number));

//change the variable
number = 2;
document.getElementById("world").addEventListener("click", partial(callback, number));

//change the variable again
number = 3;


function partial(fn, arg) {
  return function() {
    return fn.call(this, arg);
  }
}
<button id="hello">Hello</button>
<button id="world">World</button>

部分应用程序函数可以泛化为处理任何数量或参数

在 ES6 中:

function partial(fn, ...args) {
  return function(...otherArgs) {
    return fn.apply(this, [...args, ...otherArgs]);
  }
}

在 ES5 中:

function partial(fn) {
  var args = [].prototype.slice.call(arguments, 1);
  return function() {
    var otherArgs = [].[].prototype.slice.call(arguments);
    return fn.apply(this, args.concat(otherArgs));
  }
}

关于javascript - 与 addEventListener 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675228/

相关文章:

javascript - RequireJS:优化脚本并在其中包含 RequireJS 本身

javascript - 如何避免 pub/sub 的事件反射?

javascript - 如何将监听器附加到克隆的元素?

javascript - 动态加载外部 Javascript 文件,并等待其加载 - 不使用 JQuery

javascript - 如何在按钮内使用选择?

javascript - 使用 JSON 对象中的数据进行动态货币转换

php - 开源语言识别库?

javascript - 在 Chrome 中跟踪事件传播的最佳方法是什么?

jquery - 创建对象时将参数传递给 jQuery 事件处理程序

javascript - 是否可以从 google Plus Badge(添加到圈子)获得回调?