原题目
- 在浏览器环境下,判断程序输出的结果是?
var foo = 'window的foo'
let obj = {
foo: 'obj的foo',
func() {
let self = this
console.log(this.foo)
console.log(self.foo)
;(function () {
console.log(this.foo)
console.log(self.foo)
})()
}
}
obj.func()
console.log(window.foo)
- 结果
- 解释
- 第一个输出,
this
在成员函数内部,所以指向obj
,输出obj的foo
- 第二个输出,
self
和该位置的this
指向相同,所以也指向obj
,输出obj的foo
- 第三个输出,由于这个
this
在匿名函数内部,所以指向window
,var
会将变量挂载到window
上,自然就会输出window的foo
- 第四个输出,
self
的指向一直都是obj
,没有发生改变,故输出obj的foo
- 第一个输出,
变题1
- 把
obj
内部的函数func
改成以箭头函数方式赋值
var foo = 'window的foo'
let obj = {
foo: 'obj的foo',
func: () => {
let self = this
console.log(this.foo)
console.log(self.foo)
;(function () {
console.log(this.foo)
console.log(self.foo)
})()
}
}
obj.func()
console.log(window.foo)
- 结果
- 解释
- 改成箭头函数之后,
func
中this
的指向与obj
所处环境上下文的this
指向一致,即指向window
,其他的与第一个例子同理
- 改成箭头函数之后,
变题2
- 把
func
函数内部的匿名函数改成箭头函数形式
var foo = 'window的foo'
let obj = {
foo: 'obj的foo',
func() {
let self = this
console.log(this.foo)
console.log(self.foo)
;(() => {
console.log(this.foo)
console.log(self.foo)
})()
}
}
obj.func()
console.log(window.foo)
- 结果
- 解释
- 匿名函数中的
this
指向和匿名函数所在环境上下文的this
指向一致,即指向obj
- 匿名函数中的
变题3
- 二者均改成箭头函数形式,且将最外层的
foo
的声明方式从var
改成let
let = 'window的foo'
let obj = {
foo: 'obj的foo',
func: () => {
let self = this
console.log(this.foo)
console.log(self.foo)
;(() => {
console.log(this.foo)
console.log(self.foo)
})()
}
}
obj.func()
console.log(window.foo)
- 结果
- 均改成箭头函数形式后,不论哪里的
this
都指向了window
;改成let
之后,不会将变量挂载到window
对象上,故所有都是undefined
结语
如果对你有帮助的话,请点一个赞吧