面试题准备(六):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
经验分享 程序员 微信小程序 职场和发展