this 的指向规则 - 前端高频必考题
第 11 题:this 的指向规则
第 11 题:this 的指向规则(前端高频必考题)
一、this 的核心原则(最重要一句话)
this 的指向取决于函数的调用方式,而不是定义方式。
二、this 的 5 大指向规则(按优先级从低到高)
⭐ 1. 默认绑定(函数直接调用)
javascript
function fn() {
console.log(this)
}
fn() // this → window(严格模式下是 undefined)
面试解释:
- 非严格模式下:指向
window - 严格模式下:指向
undefined
⭐ 2. 隐式绑定(对象调用)
javascript
const obj = {
name: 'A',
say() {
console.log(this.name)
}
}
obj.say() // this → obj
调用点在 obj,所以 this → obj
重点:看点号左边是谁。
⭐ 3. 显式绑定(call / apply / bind)
javascript
function fn() { console.log(this.name) }
fn.call({ name: 'A' })
fn.apply({ name: 'B' })
fn.bind({ name: 'C' })()
call/apply立即执行bind返回新函数
⭐ 4. new 绑定(构造函数指向新对象)
javascript
function Person(name) {
this.name = name
}
const p = new Person('Y')
console.log(p.name) // 'Y'
new 的效果:
- 创建新对象
- 绑定 this
- 执行构造函数
- 返回新对象
优先级比 call/apply 还高。
⭐ 5. 箭头函数不绑定 this(继承外层作用域)
javascript
const obj = {
name: 'A',
say: () => {
console.log(this.name)
}
}
obj.say() // undefined
箭头函数没有自己的 this,它沿用外层(定义位置的)作用域的 this,通常是 window。
三、this 优先级(背这个就行)
scss
new 绑定 > 显式绑定(call/apply/bind) > 隐式绑定(obj.xxx) > 默认绑定(直接调用)
四、经典面试题(几乎必考)
❓ 题目 1
javascript
var name = 'window'
const obj = {
name: 'obj',
say() {
console.log(this.name)
}
}
const fn = obj.say
fn() // ?
obj.say() // ?
✔ 解析
fn()→ 默认绑定 →windowobj.say()→ 隐式绑定 →obj
❓ 题目 2:箭头函数 this
javascript
var name = 'window'
const obj = {
name: 'obj',
say: () => console.log(this.name)
}
obj.say() // ?
✔ 解析
箭头函数取决于定义位置
外层是全局 → this = window
结果: window
❓ 题目 3:new + bind
javascript
function Foo(name) {
this.name = name
}
const obj = { name: 'obj' }
const f = Foo.bind(obj)
const p = new f('A')
console.log(p.name) // ?
✔ 解析
new 优先级最高 → this 指向 p
输出: A
五、速记卡片(上班摸鱼记忆版)
javascript
🎯 this 由调用方式决定,不由定义方式决定
🏆 优先级(背诵):
new > call/apply/bind > obj 调用 > 直接调用
🧠 箭头函数没有 this,继承外层作用域(定义处)
📌 默认绑定:window / undefined
📌 隐式绑定:点号左边是谁就是谁
📌 显式绑定:call/apply/bind
📌 new:绑定到新对象