5

私は関数を持っmyfuncbindいて、特定thisの引数と他の引数をbindパラメーターリストではなく単一の配列として使用したい(このコードが実行される関数の引数としてパラメーターリストを取得するため)。その目的のために、次のようapplyに onを使用しbindます。

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'sthismyfuncです。

applyonを呼び出すことで、誤って's this を "mythis" にbind割り当ててしまいました。これは関数ではなく、呼び出すことはできません。bindbind

したがって、解決策は使用することです

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

また、バインドされた myfunc をすぐに呼び出したい場合は、次のように言えます。

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

しかし、これは私の場合には十分ではありません。なぜなら、バインドされた関数を引数として に渡す必要があるからaddEventListenerです。

助けてくれてありがとう、みんな!

4

3 に答える 3

7

メソッドの最初のパラメーターとして関数を使用する必要がありますapply。の使用はmyfunc.bind関数を呼び出しに関連付けません。それには の効果がありFunction.prototype.bind、それを使用することもできます。

メソッドの最初のパラメーターbind( thisArg) は、配列の最初の項目にする必要があります。

var bindedMyfunc = Function.prototype.bind.apply(myfunc, ["mythis", "param1", "param2"]);
于 2015-04-19T22:15:01.343 に答える
3

bind 自体が独自の this 引数を持っているようです。これは関数であり、呼び出されます。たとえば、あなたが言うときmyfunc.bind(args)bind'sthismyfuncです。

丁度。を適用する場合bindは、それを関数 (最初のパラメーター) に適用し、bind引数 (目的のthis値を含む) を配列 (2 番目のパラメーター) として渡す必要があります。

(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
于 2015-04-19T23:46:07.723 に答える