GoogleChromeコンソールで次のことを試しました。
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
なぜこれが機能しないのですか?ここで機能するFunction.prototype.callの代わりに関数を定義する方法はありますか?
GoogleChromeコンソールで次のことを試しました。
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
なぜこれが機能しないのですか?ここで機能するFunction.prototype.callの代わりに関数を定義する方法はありますか?
t2.callあなたが通過しているとき、あなたは実際に通過しているだけなので、それは機能しません.call。つまり、渡されたオブジェクトを記憶していません。
あなたが望むことを達成するために、あなたはを使うことができます.bind()。
t1(t2.call.bind(t2))
t2これにより、関数がのthis値としてバインドされます。つまり、これを行ったかの.callように呼び出すことになります。.call
t2.call
...これはあなたが望んでいたことです。
この.bind方法は、IE8以下、およびその他の古いブラウザーではサポートされていませんが、そのような場合は、ほぼ完全なシムを実装できます。
参考までに、これがたくさん必要な場合は.call、の呼び出しコンテキストとしてバインドし.bindて、少し短くすることができます。
var callBind = Function.prototype.bind.bind(Function.prototype.call);
これで、呼び出しコンテキストとしてboundを持つ.bind()関数ができました。.call()あなたがそれを呼び出すとき、それはあなたがこれをしているようになります:
.call.bind(/* the function */)
したがって、上記で行ったように、の呼び出しコンテキストとしてboundをcallBind()持つ関数を返します。したがって、次のように使用します。the function.call
t1(callBind(t2))
なぜ物事は難しいのですか?t2コールバック関数をに送信して内部t1で使用することはできませんか?call()t1
function t1(f) {
return f.call(1);
}
function t2() {
return this+1;
}
t1(t2);