2016-10-11 6 views
-3

なぜ以下のコードがundefinedを返すのか混乱しています。 console.log(this)の場合は、グローバルウィンドウオブジェクトではなくmyObjオブジェクトが取得されます。したがって、 'this'はxとyの値にアクセスするための正しいオブジェクトを明示していますが、未定義の値を返します。コードは次のとおりです。JavaScriptで 'this'キーワードを使用しています

var myObj = { 
    takeTwoNums: function (x, y) { 
     console.log(this.x); 
    } 
} 
myObj.takeTwoNums(1, 2); 
+8

'myObj'は 'X'プロパティを持っていません。あなたは 'console.log(x)'をするつもりでしたか? –

+1

はい、私は 'console.log(x)'が1を返すことを知っています。しかし、なぜ 'this.x'は' x'変数を見ることができませんか? – Haloor

+3

そこにあるので、 'this.x'は' myObj'オブジェクトの_property_を参照しますが、そこにはありません。 'this.x!== x' –

答えて

8

をお電話でtakeTwoNumsに、thismyObjが参照する同じオブジェクトを参照します。そのオブジェクトにはxというプロパティはありません。それはtakeTwoNums財産、そしてそれはtoStringなどのようなObject.prototypeから継承するプロパティのカップルが、ないx.

xがメソッドに引数ではありませんがあります。あなたはちょうどxとそれを参照してください。メソッドを呼び出すと、引数としてプロパティを持つオブジェクトが参照されません。this

あなたはこのようなものでこれを混乱することができる。我々はnewを使用するので、それは新しいオブジェクトを作成し、その新しいオブジェクトを参照thisThingyと呼ばれ、

function Thingy(x) { 
    this.x = x; 
} 

// Then 
var t = new Thingy(42); 

その場合には、我々 を作成したは、引数xの値で初期化したxという名前のプロパティを作成しました。しかしそれは単に関数を呼び出すこと以外のものです。

+1

これは大変意味があるので、オブジェクト構造内に存在しない変数にアクセスしようとしているのは、それが渡すことができる引数であるためです'myObj'オブジェクトの外側から。したがって、 'this'キーワードを使用するには、オブジェクト内で変数を定義する必要があります。次のようなものです: 'var myObj = {x:1、takeTwoNums:function(){console.log(this.x); }} myObj.takeTwoNums() ' – Haloor

+0

@Haloor:そうです。どの時点で*変数*(または*引数*)ではなく*プロパティ*と呼ばれますが、これはほとんど同じことです。 –

2

thisを使用する必要はありません。代わりに、これを試してみてください。

var myObj = { 
    takeTwoNums: function (x, y) { 
     console.log(x); 
    } 
} 
myObj.takeTwoNums(1, 2); 
1

thisはオブジェクトを参照しているため、this.xを使用して、のmyObjを要求しています。つまり、存在しないmyObj.xを探しています。

ここではオブジェクトでthisのための小さなリファレンスガイドです:

var myObj = { 
    myVal: 3, 
    takeTwoNums: function (x, y) { 
     console.log(x); 
    }, 
    takeThisNum: function (x, y) { 
     console.log(this.x); 
    }, 
    getVal: function() { 
     console.log(myVal); 
    }, 
    realGetVal: function() { 
     console.log(this.myVal); 
    } 
} 
myObj.takeTwoNums(1, 2); // Logs 1 
myObj.takeThisNum(1, 2); // Logs undefined 
myObj.getVal(); // Logs undefined 
myObj.realGetVal(); // Logs 3 
関連する問題