JavaScript中的this关键字
作为前端开发者,this关键字绝对是让人又爱又恨的存在.今天我们就来彻底搞懂它.一、this到底是什么简单来说,this是JavaScript中的一个特殊关键字, 它指向当前执行代码的上下文对象. 但具体指向谁, 得看它是怎么被调用的, 来看个示例:console.log(this);//在浏览器中输出window对象这里有个重要概念:this的指向不是在函数定义时确定的, 而是在函数被调用时确定的.这点和很多其他语言不同, 也是容易混淆的地方.二、this的四大绑定规则1) 默认绑定当函数独立调用时(不作为对象方法, 不通过call/apply/bind,也不是构造函数),this在非严格模式下指向全局对象(浏览器中是window),严格模式下是undefined.functionshowThis() {console.log(this);}showThis();//浏览器中输出 window(非严格模式)// 严格模式functionstrictShowThis() {use strict;console.log(this);}strictShowThis();//undefined2) 隐式绑定(方法调用)当函数作为对象的方法被调用时,this指向调用该方法的对象.const person {name:小明,sayHi:function() {console.log(你好,我是${this.name});}};person.sayHi();//输出 你好,我是小明 - this指向person对象隐式丢失问题:当方法被赋值给变量后调用, 会丢失原来的this绑定.const sayHi person.sayHi;sayHi();//输出 你好我是undefined-this指向全局对象或undefined3) 显示绑定我们可以强制指定函数调用时的this值, 这就是显式绑定. 使用call, apply, bind函数, 我们来看个示例:functionintroduce(lang, hobby) {console.log(我是${this.name}我会${lang}喜欢${hobby});}const person1 {name:张三 };const person2 {name:李四 };//call接受参数列表introduce.call(person1,JavaScript,打篮球);//输出 我是张三我会JavaScript喜欢打篮球//apply接受参数数组introduce.apply(person2, [Python,游泳]);//输出 我是李四我会Python喜欢游泳bind会创建一个新函数, 永久绑定this值:const person3 {name:王五 };const boundIntroduce introduce.bind(person3,Java,跑步);boundIntroduce();// 输出 我是王五我会Java喜欢跑步4) new绑定使用new调用函数(构造函数)时,this指向新创建的对象.functionPerson(name) {this.name name;this.sayName function() {console.log(this.name);};}const jack newPerson(Jack);jack.sayName();// 输出 Jack三、箭头函数的this特性箭头函数没有自己的this,它会捕获所在上下文的this值, 作为自己的this值, 且一旦确定就无法改变(即使使用call/apply/bind).const obj {name:箭头函数示例,regularFunc:function() {console.log(this.name);//this指向obj},arrowFunc:() {console.log(this.name);//this指向外层作用域(这里是window或undefined)}};obj.regularFunc();//输出 箭头函数示例obj.arrowFunc();//输出 undefined(严格模式)或空字符串(非严格模式)再看一个示例:functionTimer() {this.seconds 0;// 传统函数写法会有this问题setInterval(function() {this.seconds;// 这里的this指向window/undefinedconsole.log(this.seconds);},1000);// 箭头函数写法正确setInterval(() {this.seconds;// 这里的this指向Timer实例console.log(this.seconds);},1000);}const timer newTimer();四、特殊场景与实战应用1) DOM事件处理函数中的this:在DOM事件处理函数中,this指向触发事件的元素.document.getElementById(myBtn).addEventListener(click,function() {console.log(this);// 指向按钮元素});2) 定时器回调中的this:setTimeout(function() {console.log(this);//浏览器中指向window},1000);3) 立即执行函数中的this:(function() {console.log(this);//非严格模式指向window严格模式undefined})();4) 如何避免this的隐式丢失?//错误写法const obj {name:小明,sayHi:function() {setTimeout(function() {console.log(你好,我是${this.name});},100);}};obj.sayHi();//输出 你好,我是undefined// 解决方案1使用箭头函数const obj1 {name:小明,sayHi:function() {setTimeout(() {console.log(你好,我是${this.name});},100);}};// 解决方案2保存this引用const obj2 {name:小明,sayHi:function() {const self this;setTimeout(function() {console.log(你好,我是${self.name});},100);}};5) 多层对象调用时this的指向:const obj {name:外层,inner: {name:内层,sayName:function() {console.log(this.name);}}};obj.inner.sayName();// 输出 内层 - this指向直接调用者inner6) 类中的this:ES6类中的方法默认使用严格模式,this行为更符合预期:classPerson {constructor(name) {this.name name;}sayName() {console.log(this.name);}}const p newPerson(类示例);p.sayName();// 输出 类示例const say p.sayName;say();// 报错因为严格模式下this是undefined

相关新闻

基于plc的楼宇供电控制系统及综合防雷设计231(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于plc的楼宇供电控制系统及综合防雷设计231(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于plc的楼宇供电控制系统及综合防雷设计231(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 基于plc的楼宇供电控制系统及综合防雷设计程序仿真电路图说明书

2026/7/14 20:46:04阅读更多 →
C++高频交易性能优化:从内存管理到CPU绑核的实战策略

C++高频交易性能优化:从内存管理到CPU绑核的实战策略

1. 项目概述:为什么高频交易对C性能如此苛求?如果你正在开发或者维护一个C高频交易系统,那你一定对“微秒必争”这个词有切肤之痛。在这个领域,性能瓶颈的代价不是用户体验卡顿,而是真金白银的损失。一次不必要的内存分…

2026/7/14 20:46:04阅读更多 →
FydeOS安卓开发环境搭建:Linux与Android一体化联调实战

FydeOS安卓开发环境搭建:Linux与Android一体化联调实战

为什么有些开发者对刷机乐此不疲?从Linux到安卓,从FydeOS到游戏机系统,每一次刷机背后都是对技术边界的探索和对个性化体验的追求。这种看似"折腾"的行为,实际上反映了现代开发者对系统定制化和开发效率的深度需求。在众…

2026/7/14 20:46:04阅读更多 →
UE5安卓打包实战:从Gradle下载失败到APK部署的完整日志分析与解决方案

UE5安卓打包实战:从Gradle下载失败到APK部署的完整日志分析与解决方案

1. 项目概述:一次典型的UE5安卓打包“渡劫”之旅如果你正在用虚幻引擎5.3(UE5.3)开发移动端项目,并且卡在了打包生成APK(Android Package)这一步,尤其是被那个令人头疼的“Gradle下载失败”问题…

2026/7/14 21:41:09阅读更多 →
PUMA560机械臂MATLAB避障路径规划实战包:含RRT原始版与平滑优化版双算法

PUMA560机械臂MATLAB避障路径规划实战包:含RRT原始版与平滑优化版双算法

本文还有配套的精品资源,点击获取 简介:提供一套开箱即用的PUMA560六轴机械臂MATLAB仿真资源,聚焦三维空间下的自动避障路径规划。内置两种RRT实现:基础RRT算法(RRT.m)快速生成可行路径,优化…

2026/7/14 21:41:08阅读更多 →
3DsMax到UE5毛发制作全流程:引导线生成与Groom系统实战

3DsMax到UE5毛发制作全流程:引导线生成与Groom系统实战

1. 项目概述:从3DsMax到UE5的毛发制作之旅如果你正在为UE5里的角色做毛发,尤其是从3DsMax这类DCC软件里导出的模型,大概率已经体会过那种“模型看着还行,毛发一上就穿帮”的尴尬。UE5的Groom毛发系统功能强大,但它的工…

2026/7/14 21:41:08阅读更多 →
价值系统CT扫描:工程化诊断演化、强化与极限

价值系统CT扫描:工程化诊断演化、强化与极限

1. 项目概述:这不是一篇哲学论文,而是一套可操作的价值系统诊断工具“Mantic”这个词本身就很值得玩味——它源自古希腊语mantis,意为“先知”或“占卜者”,但在这里,它被赋予了全新的实践意义:一种对价值系…

2026/7/14 21:41:08阅读更多 →
模板驱动型文档自动化:结构化生成与确定性交付

模板驱动型文档自动化:结构化生成与确定性交付

1. 项目概述:当文档生产变成“填空题”,而不是“命题作文”你有没有过这种体验:每周要交三份客户方案,每份结构雷同——封面、目录、执行摘要、服务模块、报价单、附录;但每次都要从零新建Word,手动调格式、…

2026/7/14 21:41:08阅读更多 →
多维聚合后的数据操作:从GROUP BY到业务决策的跃迁

多维聚合后的数据操作:从GROUP BY到业务决策的跃迁

1. 项目概述:为什么多维聚合中的数据操作不是“加个GROUP BY”就完事了“Part 20: Data Manipulation in Multi-Dimensional Aggregation”——这个标题乍看像教科书里一个平平无奇的章节编号,但如果你正在处理销售仪表盘、用户行为漏斗、IoT设备时序统计…

2026/7/14 21:36:08阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →