5、JavaScript中的this关键字 - JavaScript学习系列文章 作为前端开发者,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

相关新闻

最新新闻

潮乎盲盒系统源码搭建教程:从环境配置到微信支付上线全流程

潮乎盲盒系统源码搭建教程:从环境配置到微信支付上线全流程

简介:盲盒电商的核心是抽奖玩法与支付闭环的稳定,而一套可直接上手的盲盒系统源码是业务起跑的关键。本文从服务器选型、PHP扩展依赖等基础环境讲起,梳理ThinkPHP 6框架下的目录结构与数据库导入要点,重点解析Nginx伪静态配置、权…

2026/8/26 8:30:52
ArcFace人脸识别实战:从预训练模型到微调部署全流程

ArcFace人脸识别实战:从预训练模型到微调部署全流程

简介:人脸识别作为计算机视觉领域的核心应用,其技术链路涉及目标检测、特征提取与相似度度量等多个环节。基于深度学习的人脸识别方法通过大规模数据训练,将人脸图像映射为高维向量,其中ArcFace算法通过引入角度间隔有效提升了特征…

2026/8/26 8:30:52
Beyond Compare 使用指南:从文件夹对比到命令行同步

Beyond Compare 使用指南:从文件夹对比到命令行同步

Beyond Compare 是我这些年用过最顺手的文件夹和文件对比工具,没有之一。它的核心能力就一句话:把两个文件夹、两个文件、两段配置内容放在一起,告诉你哪里不同,并且帮你把需要的改动同步过去。适合谁看?开发人员、运维…

2026/8/26 8:30:52
SAM双模态图像分割系统:完整代码、数据集与训练权重实践指南

SAM双模态图像分割系统:完整代码、数据集与训练权重实践指南

简介:图像分割是计算机视觉中的核心任务,传统语义分割模型往往受限于固定类别,换一个场景就需要重新标注和训练。以SAM为代表的提示分割模型,通过点、框或文本等条件提示生成目标掩膜,将分割任务从封闭分类转变为开放世…

2026/8/26 8:30:52
东华大学OJ系统训练法:提升机试通过率的实战技巧

东华大学OJ系统训练法:提升机试通过率的实战技巧

1. 项目背景与价值解析 作为一名计算机专业考研过来人,我深知东华大学复试机试环节的OJ系统(Online Judge)对考生的重要性。这套系统不仅考察算法基本功,更是检验考生在压力环境下编码能力的试金石。去年辅导学弟备考时&#xff0…

2026/8/26 8:30:52
EDATEC工业级树莓派CM4/CM5模块评测:从开发板到工业级部署

EDATEC工业级树莓派CM4/CM5模块评测:从开发板到工业级部署

1. 这次评测的背景这段时间我一直在给一个边缘计算项目做硬件选型,客户要求设备能长时间在产线环境跑,温度范围得够宽、供电要稳、接口要全,还得有长期供货保障。市面上开发板一大堆,但真正敢标“工业级”的没几个。朋友提到EDATE…

2026/8/26 8:25:52