执行期上下文
- 三个重要属性
- 变量对象 — Variable Object VO
- 作用域链 — Scope Chain
- this
this
函数预编译过程中 this 指向 window
全局作用域中 this 指向 window
call 和 apply 可以改变函数运行时 this 的指向
obj.func()、func() 里面的 this 指向 obj
箭头函数中,this 指向其所在作用域,无论谁调用
试一试
// 分析以下代码执行结果
var name = '222'
var a = {
name: '111',
say: function () {
console.log(this.name)
console.log(this)
},
}
var fun = a.say
fun() // A
a.say() // B
var b = {
name: '333',
say: function (fun) {
fun()
},
}
var c = {
name: '444',
say: () => {
console.log(this.name)
},
}
b.say(a.say) // C
b.say = a.say
b.say() // D
c.say() // E
答案: A:222 B:111 C:222 D:333 E:222
- 分析:
- func() 并非对象以 . 形式调用,而是在 window 作用域下直接执行,故函数中的 this 指向 window
- a.say() 以 . 形式调用,因此 this 指向调用函数的对象 a
- b.say(a.say),b.say() 的效果是执行参数中的函数,不影响 this,而当 a.say 传入时,this 所在的作用域为 window。执行过程与 1 类似
- b.say(),因为在上一句代码中,b.say 函数体已被更改为 a.say 函数体,因此执行的是 a.say 函数的内容,又因为是 . 形式调用,this 指向调用函数的对象 b
- c.say(),箭头函数指向所在作用域的的 this