Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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 - Fatal编程技术网

Javascript:绑定参数,但保留原始参数?

Javascript:绑定参数,但保留原始参数?,javascript,Javascript,我想在JavaScript中向事件侦听器的回调注入一些值,但保留原始事件对象。可能吗 示例(#1): 绑定其他参数时,如何保持原始事件对象 我知道我能做到这一点(#2): 甚至这个(#3): 但是#2使代码更难看,因为我需要在异步调用中使用变量something,而它可能在单击时就被更改了 #3偷了这个,我可能需要这个 我是否遗漏了什么和/或我对绑定的理解是否正确?你可以通过改变论点的顺序来“套用”你想要的论点: function callback(arg, event) { conso

我想在JavaScript中向事件侦听器的回调注入一些值,但保留原始事件对象。可能吗

示例(#1):

绑定其他参数时,如何保持原始
事件
对象

我知道我能做到这一点(#2):

甚至这个(#3):

但是#2使代码更难看,因为我需要在异步调用中使用变量
something
,而它可能在单击时就被更改了

#3偷了这个
,我可能需要这个

我是否遗漏了什么和/或我对绑定的理解是否正确?

你可以通过改变论点的顺序来“套用”你想要的论点:

function callback(arg, event) {
    console.log(event);
    console.log(arg);
}

var something = 2;
element.addEventListener("click", callback.bind(null, something));
通过这种方式,您可以传递“绑定”或部分应用为回调,但仍然会收到一个
事件
对象。有关更多信息,请参阅MDN文档的一节。

只需创建适合您需要的自定义“绑定”功能即可。这有点像#2,但丑陋被抽象了

function bindLast(fn) {
    var bound = Array.prototype.slice.apply(arguments, 1);

    return function() {
        Array.prototype.push.apply(arguments, bound);
        return fn.apply(this, arguments);
    };
}
然后像这样使用它

element.addEventListener("click", bindLast(callback, something));

请注意,您不需要传递thisArg。它在调用时只使用
this
的值。

确定吗?
bind()
的第一个参数是什么来代替
这个
@RoboRobok你完全正确,这是我的错别字。固定的!(我使用了
null
作为上下文,因为它对您的示例来说似乎并不重要,但是可以随意替换您需要的任何上下文。因此,基本上,如果我使用
bind()
,任何显式传递的参数(如
addEventListener
传递的
事件
)都会到达参数列表的末尾。这是“curry”的方式吗有效?正确。Curry是部分应用程序的另一个词。本质上,您返回的函数包含一些提供的参数。这里有一个快速的概述,翻转形式参数顺序,然后从左边填充。您可以找到一些提供
rppartial
功能的库。在尝试解决类似问题时,我刚刚发现红色表示您可以从eventHandler中省略
事件
参数,因此我可以将其作为一种解决方法。但这是一个公认的技巧,在其他情况下,如果不使用该选项,该怎么办仍然是一个重要的问题!:)我甚至可以更进一步,将bindLast添加到函数原型中,但这将是相当麻烦的:)
function callback(arg, event) {
    console.log(event);
    console.log(arg);
}

var something = 2;
element.addEventListener("click", callback.bind(null, something));
function bindLast(fn) {
    var bound = Array.prototype.slice.apply(arguments, 1);

    return function() {
        Array.prototype.push.apply(arguments, bound);
        return fn.apply(this, arguments);
    };
}
element.addEventListener("click", bindLast(callback, something));