返回课程

在对象字面量中使用 "this"

重要性:5

这里函数 makeUser 返回一个对象。

访问它的 ref 的结果是什么?为什么?

function makeUser() {
  return {
    name: "John",
    ref: this
  };
}

let user = makeUser();

alert( user.ref.name ); // What's the result?

答案:错误。

试试看

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 的值对于整个函数来说是唯一的,代码块和对象字面量不会影响它。

所以 ref: this 实际上获取了函数当前的 this

我们可以重写函数并用 undefined 值返回相同的 this

function makeUser(){
  return this; // this time there's no object literal
}

alert( makeUser().name ); // Error: Cannot read property 'name' of undefined

正如你所见,alert( makeUser().name ) 的结果与之前示例中 alert( user.ref.name ) 的结果相同。

以下是相反的情况

function makeUser() {
  return {
    name: "John",
    ref() {
      return this;
    }
  };
}

let user = makeUser();

alert( user.ref().name ); // John

现在它可以工作了,因为 user.ref() 是一个方法。而 this 的值被设置为点 . 之前的对象。