次のコードで、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"
次のコードで、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"
問題は、おそらくタイプミスがあることです:out.bind(window, "bla")()
代わりに書くつもりだったので、動作する呼び出しと同じ結果が得られます。
なぜ現在のコードでエラーが発生するのですか? Wellは、 withinのout.call.bind
値を に固定する関数を返します。ただし、関数であることが期待されますが、そうではありません。結果は指定されたエラーです。this
call
window
call
this
window
注釈付きの 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
代わりに、別の何かで呼び出されます。例:call
out
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