オブジェクトリテラルで "this" を使う
重要性: 5
ここにオブジェクトを返す makeUser 関数があります。
その ref へのアクセス結果は何でしょうか?それはなぜでしょう?
function makeUser() {
return {
name: "John",
ref: this
};
};
let user = makeUser();
alert( user.ref.name ); // 結果は何?
答え: エラーです
やってみましょう:
function makeUser() {
return {
name: "John",
ref: this
};
};
let user = makeUser();
alert( user.ref.name ); // Error: Cannot read property 'name' of undefined
これは this をセットするルールがオブジェクトリテラルを見ないためです。
ここで makeUser() の中の this 値は undefined です。なぜなら、関数として呼ばれており、メソッドではないためです。
また、オブジェクトリテラル自身は this に影響しません。this の値は関数全体で、コードブロックやオブジェクトリテラルはそれに影響しません。
従って、ref: this は実際にはその関数の現在の this を取ります。
これは反対のケースです:
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
};
let user = makeUser();
alert( user.ref().name ); // John
これは動作します。なぜなら user.ref() はメソッドだからです。そして this の値はドット . の前のオブジェクトがセットされます。