【前端每天一题】🔥 第 11 题:this 的指向规则(前端高频必考题)

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 的效果:
  1. 创建新对象
  2. 绑定 this
  3. 执行构造函数
  4. 返回新对象

优先级比 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() → 默认绑定 → window
  • obj.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:绑定到新对象
相关推荐
Mapmost5 分钟前
数字孪生项目效率翻倍!AI技术实测与场景验证实录
前端
小酒星小杜9 分钟前
在AI时代,技术人应该每天都要花两小时来构建一个自身的构建系统-Input篇
前端·程序员·架构
Cache技术分享17 分钟前
290. Java Stream API - 从文本文件的行创建 Stream
前端·后端
陈_杨19 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片开发完全指南
前端·harmonyos
小杨同学4925 分钟前
C 语言实战:枚举类型实现数字转星期(输入 1~7 对应星期几)
前端·后端
陈_杨26 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片刷新机制
前端·harmonyos
go_caipu34 分钟前
Vben Admin管理系统集成qiankun微服务(二)
前端·javascript
唐叔在学习38 分钟前
insertAdjacentHTML踩坑实录:AI没搞定的问题,我给搞定啦
前端·javascript·html
超绝大帅哥38 分钟前
Promise为什么比回调函数更好
前端
幸福小宝38 分钟前
uniapp 异型无缝轮播图
前端