JavaScript对象关于this的一个问题?

?来自《高程三》

var person = {
    name: "Nicholas", 
    age: 29,
    job: "Software Engineer",

    sayName: function(){
        alert(this.name);//第一种写法,使用this关键字
        alert(person.name);//第二种写法,直接使用对象引用
    }
};

问题:书上是第一种写法,但是有的框架和库经常是第二种写法,这两种写法在什么情况会不一样吗?

阅读 4.4k
5 个回答

调用对象不同的时候不一样。比如:

const {sayName} = person;
sayName(); // '',空字符串

this表示整个作用域里。用this.name的写法应该是有问题的。应该是this.person.name
第2种写法仅仅是那个对象。

单就你给出的这个场景,两种写法都是可以的。
只是有两点要说明一下

  • 有些时候是没有定义实例对象的,这个时候就只能使用this了。如下
export default {
    name: "Nicholas", 
    age: 29,
    job: "Software Engineer",

    sayName: function(){
        alert(this.name);//第一种写法,使用this关键字
        // alert(person.name);//第二种写法,直接使用对象引用
    }
};
  • 还有一点就是this的指向可能是会变动的。
let sayName = person.sayName
sayName()
// 结果并不是Nicholas
新手上路,请多包涵

第一种写法this属于隐式绑定,可能出现this丢失的情况,即:
var sayName = person.sayName
sayName() //这个时候this不在绑定到person这个上下文对象,非严格模式下绑定到window(即全局对象)

不一样。
简单来说,第一种写法的 this ,是在运行时确定的,也就是说指向当前调用者,默认指向window。
第二种写法固定指向person,所以输出是固定的,就是 Nicholas

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题