4

次のコードで、3 行目は機能し、4 行目は機能しないのはなぜですか?

function out(x) {
  console.log(x);
}
out.call(window, "bla") // outputs "bla"
out.call.bind(window, "bla")(); // throws "TypeError: object is not a function"
4

1 に答える 1

4

問題は、おそらくタイプミスがあることです:out.bind(window, "bla")()代わりに書くつもりだったので、動作する呼び出しと同じ結果が得られます。

なぜ現在のコードでエラーが発生するのですか? Wellは、 withinのout.call.bind値を に固定する関数を返します。ただし、関数であることが期待されますが、そうではありません。結果は指定されたエラーです。thiscallwindowcallthiswindow

注釈付きの ES5 仕様から:

15.3.4.5 Function.prototype.bind (thisArg [, arg1 [, arg2, …]])

bind メソッドは、1 つ以上の引数 thisArg と (オプションで) arg1、arg2 などを取り、次の手順を実行して新しい関数オブジェクトを返します。

1. Let Target be the this value.
2. If IsCallable(Target) is false, throw a TypeError exception.
[...]

期待どおりの結果が得TypeErrorられています。

補遺

このout.call.bind使用法は、同様の と同様out.call.callに、 の「ターゲットをリダイレクト」します。つまり、で呼び出されるout.call代わりに、別の何かで呼び出されます。例:callout

function foo(x) { console.log("this", this, "foo", x); }
function bar(x) { console.log("this", this, "bar", x); }

foo.call.bind(bar, window, 42)();  // "this" [window] "bar" 42
于 2013-09-12T12:09:47.890 に答える