javascript - 与 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
上下文,那么您可以使用柯里化或部分应用程序:
咖喱
您的函数必须接收一个值并返回另一个函数。这样,您可以执行以下操作:
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>
部分应用
同样的想法,但不是让你的回调返回一个新函数,它只需要一个参数并正常工作,你需要另一个函数来执行部分应用程序:
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));
}
}
推荐阅读
- scipy-optimize-minimize - Scipy 优化 PSSE 电力系统
- rdf - SHACL 验证列表并检索受约束的属性路径
- deep-learning - AttributeError: 'NoneType' 对象没有属性 'log' 这是什么意思?我该如何解决?
- react-native - 从持续时间中获取年月日小时分钟
- html - HTML5 音频播放列表在页面加载时开始不同
- python - 在 Pandas 和 Python 中打印数据框
- reactjs - React redux 共享整页依赖注入
- json - 将元素添加到嵌入在 MongoDB 的子文档中的数组中
- javascript - 你可以动态创建css类吗?
- javascript - 使用 JS、HTML 和 CSS 将多个下拉菜单彼此相邻添加