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

相关新闻

Mutiny Fuzzer异常处理指南:6大自定义异常如何精准控制重试、中止与崩溃记录策略

Mutiny Fuzzer异常处理指南:6大自定义异常如何精准控制重试、中止与崩溃记录策略

Mutiny Fuzzer异常处理指南:6大自定义异常如何精准控制重试、中止与崩溃记录策略 【免费下载链接】mutiny-fuzzer 项目地址: https://gitcode.com/gh_mirrors/mu/mutiny-fuzzer Mutiny Fuzzer 是 Cisco Talos 团队开源的网络变异模糊测试框架,它…

2026/8/25 10:43:48 阅读更多 →
基于OpenClaw与OneBot协议构建QQ群AI智能体:从部署到技能调用的全流程实践

基于OpenClaw与OneBot协议构建QQ群AI智能体:从部署到技能调用的全流程实践

1. 项目概述:当OpenClaw遇见QQ,一个AI智能体的新舞台最近在折腾AI智能体,发现了一个挺有意思的开源项目叫OpenClaw,社区里也有人叫它“小龙虾”。这玩意儿本质上是一个AI智能体框架,你可以把它理解成一个“大脑”&…

2026/8/25 10:42:48 阅读更多 →
OpenClaw智能体框架与QQ机器人集成:构建AI驱动的社群自动化助手

OpenClaw智能体框架与QQ机器人集成:构建AI驱动的社群自动化助手

1. 项目概述:当OpenClaw遇见QQ机器人最近在折腾智能助手本地化部署的朋友,估计没少听说OpenClaw(小龙虾)这个名字。它本质上是一个开源的、可扩展的智能体(Agent)框架,核心目标是把大语言模型&a…

2026/8/25 10:42:48 阅读更多 →

最新新闻

WebSocket实时通信:从协议到实现

WebSocket实时通信:从协议到实现

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍从协议到实现,涵盖核心原…

2026/8/25 12:51:13 阅读更多 →
餐饮行业为何需要独立的原材料库存管理系统?

餐饮行业为何需要独立的原材料库存管理系统?

很多餐饮老板以为收银系统自带“库存管理”就够了,实际上两者存在根本性差异: 收银系统的“库存”本质是“成品/半成品数量”——它记录的是“卖了多少份红烧肉”“还剩多少瓶可乐”,目的是前台结账和出品控制。而原材料库存管理系统管的是“…

2026/8/25 12:51:13 阅读更多 →
请求验证与统一错误处理:让API固若金汤

请求验证与统一错误处理:让API固若金汤

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍让API固若金汤,涵盖核心原…

2026/8/25 12:51:13 阅读更多 →
Swagger/OpenAPI文档自动生成:告别手写API文档

Swagger/OpenAPI文档自动生成:告别手写API文档

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍告别手写API文档,涵盖核心…

2026/8/25 12:51:13 阅读更多 →
Go gRPC实战(二) 服务端开发与四种服务方法

Go gRPC实战(二) 服务端开发与四种服务方法

TL;DR 核心要点速览 Gin框架是Go最流行的Web框架 gRPC适合内部服务,REST适合对外API JWT Token是无状态认证的标准方案 Go标准库net/http可直接构建HTTP服务 Swagger/OpenAPI可自动生成API文档 本篇是Go Web开发模块,含完整项目代码 摘要:本文详细介绍Go gRPC实战(二) 服务端开…

2026/8/25 12:51:12 阅读更多 →
能写的未必能过检:从AIGC检测原理倒推,论文AI工具到底该怎么选

能写的未必能过检:从AIGC检测原理倒推,论文AI工具到底该怎么选

去年这个时候,我正在实验室帮师妹改她的硕士论文初稿。她把一段自己用通用大模型生成的文献综述贴给我,句子通顺得无可挑剔,但读三段就觉得“太顺了”:每段都是先定义、再转折、最后总结,专业术语堆得很整齐&#xff0…

2026/8/25 12:50:12 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →