3

GoogleChromeコンソールで次のことを試しました。

> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function

なぜこれが機能しないのですか?ここで機能するFunction.prototype.callの代わりに関数を定義する方法はありますか?

4

2 に答える 2

5

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))
于 2012-11-04T03:22:40.803 に答える
2

なぜ物事は難しいのですか?t2コールバック関数をに送信して内部t1で使用することはできませんか?call()t1

function t1(f) { 
    return f.call(1); 
}

function t2() { 
    return this+1; 
}

t1(t2);
于 2012-11-04T03:23:25.093 に答える