惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Check Point Blog
GbyAI
GbyAI
D
Docker
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
T
Troy Hunt's Blog
博客园 - Franky
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Security Blog
Microsoft Security Blog
P
Privacy & Cybersecurity Law Blog
WordPress大学
WordPress大学
The Cloudflare Blog
S
SegmentFault 最新的问题
Latest news
Latest news
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
I
InfoQ
博客园 - 【当耐特】
NISL@THU
NISL@THU
A
About on SuperTechFans
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Scott Helme
Scott Helme
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
Security Archives - TechRepublic
Security Archives - TechRepublic
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
N
News and Events Feed by Topic
IT之家
IT之家
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
SecWiki News
SecWiki News
大猫的无限游戏
大猫的无限游戏
S
Security Affairs
The Register - Security
The Register - Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 热门话题
T
Tor Project blog

博客园 - lzhdim

JavaScript 中的原型与继承 1分钟查清局域网所有IP 20260714 - 个人小作品更新 WorkBuddy 完整教程手册 专为AI而生的企业级QLC SSD!长江存储PE501 61.44TB评测:超过1PB的写入测试 32GB显存才是第一生产力!英特尔锐炫 Pro B70评测:中小企业AI降本神器 C#开发的PopoSaver泡泡屏保应用 - 开源研究系列文章 - 个人小作品 6天不间断测试告诉你到底有多省电!米家空调巨省电大1.5匹评测:制冷峰值功率不超过500W 三倍双摄加持 + D-Log 2 曲线!大疆DJI OSMO Pocket 4P全面评测:补齐短板,化身口袋电影机 晶栈4.0闪存立威!长江存储致态TiPro9000 2TB SSD评测:缓外写入超4GB/s独一档 C# 多线程同步机制详解:原理、使用与性能对比 JavaScript作用域与闭包讲解 最受欢迎的 10 大免费 AI 工具 六种AI生意,从月入一万到月入十万 5个国产大模型实测对比2026:DeepSeek、Kimi、豆包、通义、智谱哪个好用 豆包、元宝、千问、Kimi、DeepSeek,这么多AI软件,到底该用哪个? 微软免费开源了一个 Linux 操作系统,没错!是微软出品 一次看懂5种咖啡冲煮方式:意式、手冲、法压、冷萃、摩卡壶到底有什么区别 120个 实用CSS 技巧汇总合集 JavaScript运算符与表达式详解 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 WinForm 中跨线程操作 UI 的解决方案 JavaScript变量与数据类型详解 苹果良心!iOS 27适配设备公布:30款机型 7年前的iPhone 11还能升级 C++图形用户界面开发入门 10个不该免费的GitHub神级项目 JavaScript语言全面概述:从历史到现代实践 一张图看懂常见咖啡 C盘空间多出来4GB:谷歌服软 Chrome本地AI大模型可禁用、删除了 96GB显存运行230B大模型!七彩虹灵创K16笔记本评测:160W性能释放 AMD锐龙AI Max+ 395加持全能移动AI工作站 AI PC最强存储搭档!雷克沙NM1090 PRO 8TB固态评测:14400MB/s满速不缩水 C#已经不是当年的C#了——我用它写了个微秒级数据库引擎 EasyTool:轻量全能的 .NET 工具类库 SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析 SQL 入门 16:SQL 事务隔离级别与死锁解析(易懂) 原相3955XM+TL3228主控!小米电竞鼠标2全面评测:原生双8K究竟有多强 PCIe 4.0火力全开:闪迪奥丁马仕GX 7100 NVMe SSD上手 超乎预料的千元级电竞主板!七彩虹iGame B850M Ultra-OC V14主板评测 SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题 名人 - 我的闪存 C#性能优化技巧 SQL 入门 14:SQL 触发器与事件:自动化数据处理 38个实用的JavaScript 技巧 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb Masuit.Tools:这个 C# 工具库 SQL 入门 13:SQL 存储过程与函数:封装逻辑与参数处理 49个 JavaScript 代码快捷技巧,让你在 2026 年成为代码高手 20260503 - 个人小作品更新 SQL 入门 12:SQL 视图:创建、修改与可更新视图 C#如何实现Windows系统桌面截图功能... 6999元AMD新旗舰首测!锐龙9 9950X3D2性能解禁:这颗U根本不是给游戏玩家造的 SQL 入门 11:日期时间格式化、IF、CASE的使用 基于C#的校时类库的实现及使用 - 开源项目研究文章 39g无打孔+原生双8K!雷柏VT0 Air MAX / VT3s Air MAX鼠标评测:轻到飞起还快到极致 WinForm 中控件自适应窗体变化 20260413 - 个人小作品更新 SQL 入门 10:SQL 内置函数:数值、字符串与时间处理 最强麒麟芯+自研风冷 华为Mate80 Pro MAX 风驰版全面评测:涡轮散热封神 性能稳到骨子里 WiFi8核心技术特性与性能分析 2026年最新AMD/Intel桌面CPU排名:多线程、单线程、游戏性能谁才是第一 用DG对C盘进行扩容 - 初学者系列 - 学习者系列 还有比它更强的OEM固态吗!长江存储PC550 1TB评测:不用散热片也能满速的PCIe 5.0 SSD SharpCompress:跨平台的 C# 压缩与解压库 SQL 入门 9:SQL 高级子查询:ANY、EXISTS 与多位置应用 盘点接私活20个最实用的 .NET 开源项目 C#中加载图片的资源释放 20260404 - 个人小作品更新 开启iphone的墙纸玻璃效果 可能是综合性能最强的PCIe 5.0 SSD!铠侠EXCERIA PRO G2 2TB评测:AIDA64线性写入全程不掉速 SQL 入门 8:SQL 复杂查询:子查询与ALL关键词 性能最强的锐龙AI 9 H 465轻薄本!华硕无畏Pro16锐龙版2026评测 4盘RAID 0读写超1100MB/s!希捷酷狼Pro 32TB硬盘评测:百万文件快速完成备份 项目(Project)、项目集(Program)、项目组合(Portfolio) SQL 入门 7:SQL 聚合与分组:函数、GROUP BY 与 ROLLUP
JavaScript中的this关键字
lzhdim · 2026-07-13 · via 博客园 - lzhdim

作为前端开发者, this关键字绝对是让人又爱又恨的存在.今天我们就来彻底搞懂它.一、this到底是什么简单来说, this是JavaScript中的一个特殊关键字, 它指向当前执行代码的上下文对象. 但具体指向谁, 得看它是怎么被调用的, 来看个示例:

console.log(this); 

这里有个重要概念: this的指向不是在函数定义时确定的, 而是在函数被调用时确定的. 这点和很多其他语言不同, 也是容易混淆的地方.二、this的四大绑定规则1) 默认绑定当函数独立调用时(不作为对象方法, 不通过call/apply/bind,也不是构造函数),this在非严格模式下指向全局对象(浏览器中是window), 严格模式下是undefined.

function showThis() {  console.log(this);}
showThis(); //浏览器中输出 window(非严格模式)
// 严格模式function strictShowThis() {  'use strict';  console.log(this);}
strictShowThis(); //undefined

2) 隐式绑定(方法调用)当函数作为对象的方法被调用时, this指向调用该方法的对象.

const person = {  name: '小明',  sayHi: function() {    console.log(`你好,我是${this.name}`);  }};
person.sayHi(); //输出 "你好,我是小明" - this指向person对象

隐式丢失问题: 当方法被赋值给变量后调用, 会丢失原来的this绑定.

const sayHi = person.sayHi;sayHi(); //输出 "你好,我是undefined"-this指向全局对象或undefined

3) 显示绑定我们可以强制指定函数调用时的this值, 这就是显式绑定. 使用call, apply, bind函数, 我们来看个示例: 

function introduce(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指向新创建的对象.

function Person(name) {  this.name = name;  this.sayName = function() {    console.log(this.name);  };}
const jack = new Person('Jack');jack.sayName(); // 输出 "Jack"

三、箭头函数的this特性箭头函数没有自己的this, 它会捕获所在上下文的this值, 作为自己的this值, 且一旦确定就无法改变(即使使用call/apply/bind).

const obj = {  name'箭头函数示例',  regularFuncfunction() {    console.log(this.name);   },  arrowFunc() => {    console.log(this.name);   }};
obj.regularFunc(); //输出 "箭头函数示例"obj.arrowFunc(); //输出 undefined(严格模式)或空字符串(非严格模式)

再看一个示例:

function Timer() {  this.seconds = 0;
  // 传统函数写法会有this问题  setInterval(function() {    this.seconds++;     console.log(this.seconds);  }, 1000);
  // 箭头函数写法正确  setInterval(() => {    this.seconds++;     console.log(this.seconds);  }, 1000);}
const timer = new Timer();

四、特殊场景与实战应用1) DOM事件处理函数中的this:在DOM事件处理函数中,this指向触发事件的元素.

document.getElementById('myBtn').addEventListener('click'function() {  console.log(this); });

2) 定时器回调中的this:

setTimeout(function() {  console.log(this); }, 1000);

3) 立即执行函数中的this:

(function() {  console.log(this); })();

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'内层',    sayNamefunction() {      console.log(this.name);    }  }};
obj.inner.sayName(); 

6) 类中的this:ES6类中的方法默认使用严格模式, this行为更符合预期:

class Person {  constructor(name) {    this.name = name;  }
  sayName() {    console.log(this.name);  }}
const p = new Person('类示例');p.sayName(); // 输出 "类示例"
const say = p.sayName;say(); // 报错,因为严格模式下this是undefined