Javascript 向事件函数添加其他参数
我有一个事件,我想向命名函数添加其他参数。我尝试了以下两件事:Javascript 向事件函数添加其他参数,javascript,javascript-events,Javascript,Javascript Events,我有一个事件,我想向命名函数添加其他参数。我尝试了以下两件事: myDiv.addEventListener('click', evt.call(this, event, 'hello')); 及 它们的问题是,它们会立即被调用,而当您单击myDiv时,它们不会被调用,也就是说,当它应该被调用时 如何向命名函数事件添加其他参数 console.clear(); var myDiv=document.getElementById('myDiv'); 函数evt(事件,参数1){ consol
myDiv.addEventListener('click', evt.call(this, event, 'hello'));
及
它们的问题是,它们会立即被调用,而当您单击myDiv时,它们不会被调用,也就是说,当它应该被调用时
如何向命名函数事件添加其他参数
console.clear();
var myDiv=document.getElementById('myDiv');
函数evt(事件,参数1){
console.log(事件+'和'+param1)
}
myDiv.addEventListener('click',evt.call(this,event,'hello')代码>
#myDiv{
宽度:200px;
高度:200px;
背景颜色:绿色;
}
只需为事件处理程序使用一个匿名函数,该函数调用evt
函数并传入事件对象和参数:
myDiv.addEventListener('click', function ( e ) {
evt( e, 'hello' );
} );
您可以使用匿名包装器:
myDiv.addEventListener('click', function(event) {
return evt.call(this, event, 'hello');
});
或者,您可以给自己一个实用函数(我倾向于称之为curry
;纯粹主义者可能会反对这个名称)。这是一个未经优化的即兴表演:
Object.defineProperty(Function.prototype, "curry", {
value: function() {
var f = this;
var boundArgs = Array.prototype.slice.call(arguments);
return function() {
return f.apply(this, boundArgs.concat(Array.prototype.slice.call(arguments)));
};
}
});
然后:
但是您必须更改evt
中的参数顺序:
function evt(param1, event) {
console.log(event + ' and ' + param1)
}
…因为我的curry
版本首先传递curry参数,然后传递调用curry版本的参数。虽然我想如果你愿意的话,交换它们是很容易的
以下是ES2015+中的curry
函数:
Object.defineProperty(Function.prototype, "curry", {
value(...boundArgs) {
var f = this;
return function(...callArgs) {
return f.call(this, ...boundArgs, ...callArgs);
};
}
});
你在找吗?阅读关于函数#bind
@MikeC不,我不想改变这个
。我只想为事件添加更多参数function@MikeC你说得对!我以为bind
就是把这个
添加进去。谢谢在使用匿名包装器和返回evt.call(此事件为“hello”)之间,哪一种性能更好
,或者使用bind
创建一个变量?@Jessica您必须检查以确定,但我的假设是,匿名函数更快,因为它不必绑定此
。这只取决于您是否需要此
等于某个值,以及这是否是代码的性能关键部分。此上下文
是否会持续?不,与上述情况无关。@Rayon no,但此
不用于evt
。如果是,您可以使用evt.call(this,e,'hello')代码>。谢谢!在使用匿名包装器和返回evt.call(此事件为“hello”)之间,哪一种性能更好代码>,或者使用bind
创建变量?这是一个元注释,但是:有大量DUP,但它们大多隐藏在糟糕/不相关的标题和措辞后面。通常提问者甚至不知道他们的实际问题是什么。Jessica的帖子标题不错,也许这篇帖子是一个潜在的规范dup目标?@Teemu:这正是我在查找时发现的,隐藏在onxyz
属性或jQuery或其他非常糟糕的代码中的实际问题。杰西卡的是一个好的,明确的,简单的一个。我在,我将保存此链接并在将来使用它。我已经把答案写成了CW(只是让我觉得把未来的答案指向它会更好)。@杰西卡:哪一个表现更好真的很不重要。如果我不得不猜测(这将是一个猜测),我会说可能是匿名函数。但是有很多副作用,比如,因为它是一个闭包,所以当你创建它时,它会关闭范围内的所有东西。现在,现代发动机非常擅长优化,但仍然。。。也就是说,如果你保持你的函数很小,避免嵌套太深,我怀疑这是否重要。@T.J.Crowder谢谢!
function evt(param1, event) {
console.log(event + ' and ' + param1)
}
Object.defineProperty(Function.prototype, "curry", {
value(...boundArgs) {
var f = this;
return function(...callArgs) {
return f.call(this, ...boundArgs, ...callArgs);
};
}
});