利用下面这段代码分析一下Javascript中this的指向性。参考了用设计模式、this巧妙整理vue中的methods - 掘金 (juejin.cn)。
代码分析:
a、test是一个对象,里面定义了属性name和方法函数todo()。
b、dowhat()函数和dothis()函数都不是方法函数,
dowhat()是普通函数, dothis()是箭头函数。
下面分析当this分别出现在①②③④位置时,this的指向情况。
①this出现在对象中,如test对象(不知道有没有这种情况??其实还没遇到过^_^):
→因为并不是在test的对象的method函数中,
所以如果直接子test里面调用this.xx的话,
这个this指向全局对象。
②this出现在方法函数中(即this所属的直接父函数是一个method函数)
→如图,因为todo()是方法函数,所以如果在这里调用this.name,
那this指向的是test对象实例。
③this出现在普通函数中(即this所属的直接父函数dowhat()是一个普通函数)
→因为javascritp中普通函数的this默认指向全局对象(javascript的规则),
所以这个this指向全局对象。
(即使这个普通函数是在method函数中定义的也一样!!它只考虑this的直接父函数是method还是普通函数)
④this出现在箭头函数中(即this所属的直接父函数dothis()是一个普通函数)
→因为箭头函数中的this指向的是其父父函数(祖父函数)中的this 指向一致(javascript的规则),所以这个this和其祖父函数todo()中的this指向一样,即test对象实例。