this 的前世今生:谁在叫我,我听谁的

"我不是你以为的我,我是谁,取决于你怎么叫我。"

------ this 的自我认知觉醒时刻


🧠 一、什么是 this?

在 JavaScript 中,this 是一种运行时绑定,它代表的是函数被调用时的上下文对象

不是定义位置、不是写在哪儿的对象、不是函数自己。

只有一个真理:

谁调用我,我就指向谁!


🧭 二、this 的五大使用场景(含画面记忆)


1️⃣ 普通函数调用:没人叫我,我就随便跑

scss 复制代码
function say() {
  console.log(this);
}
say(); // 浏览器:window,严格模式:undefined

📌 图像记忆

"没人指定我,我就回家(window)喝茶;严格模式下我连家都没有,只能飘着。"


2️⃣ 对象.方法():谁叫我,我就听谁的

javascript 复制代码
const obj = {
  name: '小吴',
  say() {
    console.log(this.name);
  }
};
obj.say(); // 小吴

📌 图像记忆

"老板喊我发言,我当然听老板的!"


3️⃣ call/apply/bind:强行换老板

javascript 复制代码
function show() {
  console.log(this.name);
}
show.call({ name: '小吴' }); // 小吴

📌 图像记忆

"有人强行塞我个老板,那我就换部门。"


4️⃣ 构造函数(new):刚出生,我自己就是 this

ini 复制代码
function Person(name) {
  this.name = name;
}
const p = new Person('小吴');
console.log(p.name); // 小吴

📌 图像记忆

"我是谁?我是刚出生的我,我的 this 是我自己。"


5️⃣ 箭头函数:我听妈的,不听你

javascript 复制代码
const obj = {
  name: '小吴',
  say: () => {
    console.log(this.name);
  }
};
obj.say(); // undefined

📌 图像记忆

"我是箭头函数,从出生起就认了'妈',你再怎么喊我,我也不换妈。"


🧪 三、记忆表格总结

使用方式 this 指向 图像记忆关键词
普通函数调用 window 或 undefined "没人叫我我就漂着"
对象.方法() 谁调用我我就指向谁 "谁点我我听谁"
call/apply/bind 显式绑定的对象 "换老板、改指向"
构造函数 new 新对象本身 "新出生就是我"
箭头函数 定义时所在作用域的 this "妈宝函数,死认妈"

🔥 四、实战题巩固理解(附解析)

下面是一套由浅入深的实战题,每一题都附有简要解释,帮你彻底掌握 this!


✅ 题 1:全局函数的 this

javascript 复制代码
'use strict';
function whoAmI() {
  console.log(this);
}
whoAmI();

✅ 输出:undefined

🧠 原因:严格模式下,没有调用者,this 默认为 undefined。


✅ 题 2:对象点方法

javascript 复制代码
const obj = {
  name: '小吴',
  say() {
    console.log(this.name);
  }
};
obj.say();

✅ 输出:小吴

🧠 原因:obj.say(),this 就是 obj。


✅ 题 3:函数脱壳

ini 复制代码
const obj = {
  name: '小吴',
  say() {
    console.log(this.name);
  }
};
const fn = obj.say;
fn();

✅ 输出:undefined(浏览器下也许是 '全局'

🧠 原因:函数独立调用,this 默认指向 window / undefined。


✅ 题 4:箭头函数继承外层 this

javascript 复制代码
const obj = {
  name: '小吴',
  say() {
    return () => {
      console.log(this.name);
    };
  }
};
obj.say()();

✅ 输出:小吴

🧠 原因:箭头函数继承 say() 的 this,也就是 obj。


✅ 题 5:箭头函数用 bind 改不了 this

ini 复制代码
const arrow = () => {
  console.log(this.name);
};
arrow.call({ name: '小吴' });

✅ 输出:undefined

🧠 原因:箭头函数 this 固定为定义时作用域,call 没用!


✅ 题 6:构造函数 this

ini 复制代码
function Person(name) {
  this.name = name;
}
const p = new Person('小吴');
console.log(p.name);

✅ 输出:小吴

🧠 原因:new 调用,this 是新创建对象 p。


✅ 题 7:setTimeout 的坑

javascript 复制代码
const obj = {
  name: '小吴',
  say() {
    setTimeout(function () {
      console.log(this.name);
    }, 100);
  }
};
obj.say();

✅ 输出:undefined

🧠 原因:普通函数作为 setTimeout 回调,this 不是 obj,而是 window。


✅ 题 8:setTimeout 改进版(箭头函数)

javascript 复制代码
const obj = {
  name: '小吴',
  say() {
    setTimeout(() => {
      console.log(this.name);
    }, 100);
  }
};
obj.say();

✅ 输出:小吴

🧠 原因:箭头函数继承 say 方法的 this。


✅ 题 9:bind 后的 this

ini 复制代码
const obj = {
  name: '小吴'
};
function show() {
  console.log(this.name);
}
const bound = show.bind(obj);
bound();

✅ 输出:小吴

🧠 原因:bind 固定了 this 为 obj。


✅ 题 10:bind 和 new 谁更强?

ini 复制代码
function Person(name) {
  this.name = name;
}
const Bound = Person.bind({ name: '假名' });
const p = new Bound('小吴');
console.log(p.name);

✅ 输出:小吴

🧠 原因:new 优先于 bind,忽略了 bind 指定的 this。


🎓 五、提升总结:this 背后的编程思想

this 是 JS 中最能体现"执行时上下文"的一个关键词。

如果你搞懂了 this,你就能掌握:

  • 函数执行上下文
  • 闭包与作用域链
  • 箭头函数的行为特性
  • new 和原型链关系
  • call / apply / bind 的原理

✅ 一句话终极记忆法

"this 指向谁,不是看函数在哪写,而是看它怎么被调用。"


相关推荐
测试涛叔33 分钟前
金三银四软件测试面试题(800道)
软件测试·面试·职场和发展
2501_920931701 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05281 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔1 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李1 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN1 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒1 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库2 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
方也_arkling2 小时前
Element Plus主题色定制
javascript·sass
电商API_180079052472 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫