Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向事件函数添加其他参数_Javascript_Javascript Events - Fatal编程技术网

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);
        };
    }
});