私はこのキーワードをjavascriptで理解しようとしていますが、私はさまざまな記事を読んでいますが、まだ混乱しているようです。javascriptでこのキーワードにバインド
例えば以下のコードを考えてみましょう:
/*
* script.js
*/
var data = 'global data';
var myObj = {
data: 'object data',
scope: function() {
console.log(this.data);
}
};
myObj.scope(); // print "object data"
だからこの場合はスコープ()関数の呼び出しコンテキストはオブジェクトであり、このは、オブジェクト自体にバインドされています。
今、このが参照クリックイベントではスコープ()関数
document.getElementById("button").addEventListener('click', myObj.scope, false);
// click on the button => print "undefined"
をトリガするために
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input type="button" value="clickme" id="button">
<script src="script.js"></script>
</body>
</html>
..さんは、いくつかのHTMLを追加してみましょう...とボタンのクリックイベントリスナーデータプロパティを持たないボタンオブジェクトに渡すので、undefinedが正しく出力されます。 今、私は宣言時に(コールまたは適用の代わりに)バインドメソッドを使用してこの問題を修正したいと考えています。したがって、私は書く:
/*
* script.js
*/
var data = 'global data';
var myObj = {
data: 'object data',
scope: function() {
console.log(this.data);
}.bind(this)
};
document.getElementById("button").addEventListener('click', myObj.scope, false);
myObj.scope(); // print "global data"
// click on the button => print "global data"
私が代わりにこのmyobjのグローバルオブジェクト(ウィンドウ)にバウンディングいているようです。どうして? こののキーワードは、console.log(this.data)最初の例では、bind(this)最後の例で使用されていますか?両方ともmyObjを参照するべきではありませんか? 私はこの点についていくつかの混乱があると確信していますので、事前に説明してくれてありがとうございます:)
'myObj.scope.bind(myObj)'を 'addEventListener'に渡す必要があります。オブジェクトリテラルの内部で関数をバインドすることはできません。 – Bergi
それはあなた自身が関数 'myObj.scope'を渡すだけなので、' myObj'からその関数を抜き取ってそれ自身の関数として張っていると、その関数がどのように見えるかを考えます。アクセスしようとしている範囲をどのように知っていますか?このようにデータを構造化する必要がありますか?代わりに、どのようなスコープのパラメータを取る関数を持つ必要があります –
可能な複製[JavaScriptの "this"キーワードはオブジェクトリテラル内でどのように動作しますか?](http://stackoverflow.com/q/13441307/1048572 ) – Bergi