Function.prototype.bind.apply() 没有按预期工作

Function.prototype.bind.apply() doesn't work as expected

我有一个函数 myfunc 并且想 bind 它作为一个特定的 this 参数和 bind 的其他参数作为单个数组,而不是参数列表(因为我将参数列表作为函数的参数,执行此代码)。 为此,我在 bind 上使用 apply,如下所示:

var myfunc = function(arg1, arg2){
    alert("this = " + this + ", arg1 = " + arg1 + ", arg2 = " + arg2);
}
var bindedMyfunc = myfunc.bind.apply("mythis", ["param1", "param2"]);
bindedMufunc();

这导致 Uncaught TypeError: Bind must be called on a function

我做错了什么?您能否详细解释一下,当我 运行 这段代码时发生了什么,因为现实似乎与我对此的看法相矛盾?

答案总结: 似乎 bind 本身有它自己的 this 参数,这是调用它的函数。例如。当你说 myfunc.bind(args) 时,bindthismyfunc.

通过在 bind 上调用 apply,我错误地将 bind 的 this 分配给了 "mythis",这不是一个函数,bind 可以不请自来。

所以,解决方案是使用

myfunc.bind.apply(myfunc, ["mythis"].concat(["param1", "param2"]))

此外,如果您想立即调用绑定的 myfunc,您可以说:

myfunc.apply.bind(myfunc)("mythis", ["param1", "param2"])

但这不足以满足我的要求,因为我需要将绑定函数作为参数传递给 addEventListener

谢谢你们的帮助,伙计们!

您应该将该函数用作 apply 方法的第一个参数。使用 myfunc.bind 不会将函数与调用相关联,它具有 Function.prototype.bind 的效果,您也可以使用它。

bind 方法的第一个参数 (thisArg) 应该是数组中的第一项。

var bindedMyfunc = Function.prototype.bind.apply(myfunc, ["mythis", "param1", "param2"]);

也许您想 bind apply 而不是 applying bind

var bindedMyfunc = Function.prototype.apply.bind(myfunc);
bindedMyfunc('obj', [1, 2]); // this = obj, arg1 = 1, arg2 = 2

我经常使用这种模式使 hasOwnProperty 检查更短而不会被隐藏;

var has = Function.prototype.call.bind(Object.hasOwnProperty);
has({foo:1}, 'foo'); // true
has({foo:1}, 'bar'); // false

Seems that bind itself has its own this argument, which is the function, it is called on. E.g. when you say myfunc.bind(args), bind's this is myfunc.

没错。如果你想应用 bind,那么你必须将它应用到函数(第一个参数),并将 bind 参数(包括预期的 this 值)作为数组传递(第二个参数):

(Function.prototype.bind).apply(myfunc, ["mythis", "param1", "param2"])
// which is equivalent to
myfunc.bind("mythis", "param1", "param2")
(…args) => myfunc.call("mythis", "param1", "param2", …args) // ES6 syntax

但是,还有另一种方法可以解决您的问题:将 apply 绑定到函数,并部分应用建议的 apply 参数:

(Function.prototype.apply).bind(myfunc, "mythis", ["param1", "param2"])
// which is equivalent to
(…args) => myfunc.apply("mythis", ["param1", "param2"], …args) // ES6 syntax