2017-08-11 3 views
3

では、JavaScriptのbindメソッドは期待通りに動作していないようです

var obj = { 
 
    say: function() { 
 
     function _say() { 
 
      console.log(this); 
 
     } 
 
     return _say.bind(obj); 
 
    }() 
 
}; 
 

 
obj.say();
コード結果は、グローバルまたはウィンドウ、私はバインドメソッドは「にこれを」結合しない理由を知りたいログアウトある

objオブジェクトコンテキスト?

+0

実際の問題は 'this'バインディングが必要な場合です。なぜ実際のオブジェクトとプロトタイプを使用していないのですか?表示されたコードは、 "インスタンスロジック"を "インスタンスのものがない"コードに取り込みしようとします。これはJavaScriptでできますが、実際には...ばかげているのでしょうか?実際にこのコードを使って何をしようとしていますか? (またはこのようなコードで) –

+0

(1) 'return _say.bind(obj);'行にブレークポイントを置きます。 (2)そこで停止したら、 'obj'の値を調べます。 (3)本当に難しいと思う。 (4)IIFEの結果をプロパティ 'say'に代入しようとしている理由をあなたの[rubber ducky](https://en.wikipedia.org/wiki/Rubber_duck_debugging)に説明してください。 –

+0

あなたのコメントのおかげで@Mike 'Pomax' Kamermans。このコードはちょうど練習です、なぜ私はバインド(未定義)を使用するときに 'this'がグローバルであるのか知りたいのです。 – smallbone

答えて

1

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であることクロームデバッガで確認することができます。

+0

@ASDGerte。しかし、_say関数が 'this'を 'undefined'にバインドすると、obj.say()の 'this'がobjではなくglobal/windowにバインドされるのはなぜですか? – smallbone

+0

@smallboneが編集されました。私はちょうど答えた後にそれを探していた:) – ASDFGerte

+0

私はそれを得た!どうもありがとうございます。 – smallbone

0

この関数をすぐに呼び出しています。かっこはsayの後に削除してください。あなたは二つの連続括弧割り当て変数obj中にobj.say()()使用.call()代わり

関連する問題