示例
let a = {
name: 'A',
hehe: function () {
let f1 = function () {
console.log('f1', this)
}
let f2 = () => {
console.log('f2', this)
}
f1()
f2()
}
}
a.hehe()
// 输出结果
// f1 window对象
// f2 a对象
class A {
constructor () {
this.name = 'A'
}
hehe () {
let f1 = function () {
console.log('f1', this)
}
let f2 = () => {
console.log('f2', this)
}
f1()
f2()
}
}
let a = new A()
a.hehe()
// 输出结果
// f1 undefined
// f2 a对象
对于f2,由于是箭头函数,this相当于普通变量,本身没有时向父级作用域获取,因此获取到对象a
对于f1,结果确实应该是undefined,但由于代码并未采用严格模式,因此输出的应当是window对象。经查阅MDN(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes),class中默认采用严格模式,因此即使我不显示地声明严格模式,f1中仍会输出undefined
严格模式
类声明和类表达式的主体都执行在严格模式下。比如,构造函数,静态方法,原型方法,getter和setter都在严格模式下执行。
网友评论