面试题准备(六):this 指向

执行期上下文

  • 三个重要属性
    • 变量对象 — 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

  • 分析:
  1. func() 并非对象以 . 形式调用,而是在 window 作用域下直接执行,故函数中的 this 指向 window
  2. a.say() 以 . 形式调用,因此 this 指向调用函数的对象 a
  3. b.say(a.say),b.say() 的效果是执行参数中的函数,不影响 this,而当 a.say 传入时,this 所在的作用域为 window。执行过程与 1 类似
  4. b.say(),因为在上一句代码中,b.say 函数体已被更改为 a.say 函数体,因此执行的是 a.say 函数的内容,又因为是 . 形式调用,this 指向调用函数的对象 b
  5. c.say(),箭头函数指向所在作用域的的 this
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值