【前端每天一题】🔥 第 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:绑定到新对象
相关推荐
前端一课1 小时前
【前端每天一题】🔥 第 13 题:原型链查找规则是什么?为什么对象能访问到方法?
前端·面试
一 乐1 小时前
餐厅管理智能点餐系统|基于java+ Springboot的餐厅管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
北极糊的狐1 小时前
父组件向子组件传参时,传递数组和对象类型的参数的方法
前端·javascript·vue.js
前端一课1 小时前
【前端每天一题】🔥 第 9 题:防抖(debounce)与节流(throttle)的区别?如何实现?
前端·面试
前端一课2 小时前
【前端每天一题】🔥 第 10 题:浅拷贝 vs 深拷贝?如何手写深拷贝?
前端·面试
前端一课2 小时前
【前端每天一题】🔥 第 8 题:什么是事件委托?它的原理是什么?有哪些优点和常见坑? - 前端高频面试题
前端·面试
前端一课2 小时前
【前端每天一题】🔥第7题 事件冒泡与事件捕获 - 前端高频面试题
前端·面试
前端一课2 小时前
【前端每天一题】 第 5 题:Promise.then 执行顺序深入题(微任务队列机制)
前端·面试
前端一课2 小时前
【前端每天一题】🔥 事件循环第 6 题:setTimeout(fn, 0) 执行时机详解
前端·面试