では、JavaScriptのbindメソッドは期待通りに動作していないようです
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
objオブジェクトコンテキスト?
では、JavaScriptのbindメソッドは期待通りに動作していないようです
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
objオブジェクトコンテキスト?
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.call(this);
}
};
obj.say();
.bind()
のせずに関数を呼び出すことを期待している場合は、まだ任意の値を持っていません。したがって、バインドする呼び出しは、あなたが観察したように動作する.bind(undefined)
と同等です。
this
が原因OrdinaryCallBindThis次の工程(非strictモードを)やっているwindow
を参照して、具体的には:
[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].
あなたは[[BoundThis]]
が実際にあなたの呼び出し後undefined
であることクロームデバッガで確認することができます。
この関数をすぐに呼び出しています。かっこはsay
の後に削除してください。あなたは二つの連続括弧割り当て変数obj
中にobj.say()()
使用.call()
代わり
実際の問題は 'this'バインディングが必要な場合です。なぜ実際のオブジェクトとプロトタイプを使用していないのですか?表示されたコードは、 "インスタンスロジック"を "インスタンスのものがない"コードに取り込みしようとします。これはJavaScriptでできますが、実際には...ばかげているのでしょうか?実際にこのコードを使って何をしようとしていますか? (またはこのようなコードで) –
(1) 'return _say.bind(obj);'行にブレークポイントを置きます。 (2)そこで停止したら、 'obj'の値を調べます。 (3)本当に難しいと思う。 (4)IIFEの結果をプロパティ 'say'に代入しようとしている理由をあなたの[rubber ducky](https://en.wikipedia.org/wiki/Rubber_duck_debugging)に説明してください。 –
あなたのコメントのおかげで@Mike 'Pomax' Kamermans。このコードはちょうど練習です、なぜ私はバインド(未定義)を使用するときに 'this'がグローバルであるのか知りたいのです。 – smallbone