1

私がオブジェクト'msg'を持っていると考えてみましょう。次の場合にそれを再定義しますが、そのプロパティ(特にm1)の動作を理解していません。オブジェクト内で未定義であり、関数を介してアクセスしたときに文字列値が与えられる理由(最後の場合)。それぞれの場合について説明できますか

case 0
    var msg = {
    m1 : "this is string",
    m2 : "ok, " + this.m1

};

console.log(msg.m1); //this is string
console.log(msg.m2); // ok, undefined
/////// why m1 is undefined inside msg
//------------------------------------------
case 1
var msg1 = new Object(msg);

console.log(msg1.m1); //this is string
console.log(msg1.m2); // ok, undefined
//again undefined

//------------------------------------------
case 2
var msg2 = {
    m1 : function () { return "this is string";},
    m2 : "ok, " + this.m1,
    m3 : typeof this.m1

};

console.log(msg2.m1()); //this is string
console.log(msg2.m2); // ok, undefined
console.log(msg2.m3); // undefined
console.log(typeof msg2.m1) // function  'but inside msg2 it is undefined why'

//------------------------------------------
case 3
var msg3 = {
    m1 : (function () { return "this is string";}()),
    m2 : "ok, " + this.m1,
    m3 : typeof this.m1
};
console.log(msg3.m1); //this is string
console.log(msg3.m2); // ok, undefined
console.log(msg3.m3); // undefined
console.log(typeof msg3.m1) // string (atleast i know why this is )  but inside msg2 it is not defined (why )

//------------------------------------------
case 4
var msg4 = {
    m1 : (function () { return "this is string";}()),
    m2 : function () { return "ok, " + this.m1; },
    m3 : typeof this.m1
};
console.log(msg4.m1); //this is string
console.log(msg4.m2()); // ok, this is string 
console.log(msg4.m3); // undefined
console.log(typeof msg4.m1) // string (atleast i know why this is )  but inside msg2 it is not defined and in m2 it evaluated (why so) 
4

1 に答える 1

3

thisオブジェクトリテラル構文を介して現在作成されているオブジェクトを参照することはありません。

this環境の呼び出しコンテキストを指します。オブジェクト自体には呼び出しコンテキストはありませんが、呼び出しコンテキストとして使用できます。

msg4.m2()あなたの作品に注目してください。これthisは、関数の呼び出しコンテキストであり、メソッドが呼び出されたオブジェクト(オブジェクト)への参照であるためmsg4です。

どのようにして関数msg4の呼び出しコンテキストになりましたか?m2これを行うと、次のようになります。

msg4.m2();

オブジェクトを呼び出しm2 msg4ます。thisこれにより、オブジェクトを指すように呼び出しコンテキストが自動的に設定されmsg4ます。

于 2012-09-27T17:52:30.867 に答える