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)
时,bind
的 this
是 myfunc
.
通过在 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
而不是 apply
ing 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
我有一个函数 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)
时,bind
的 this
是 myfunc
.
通过在 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
而不是 apply
ing 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
'sthis
ismyfunc
.
没错。如果你想应用 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