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);