国外网站推荐seo网站图片优化

张小明 2026/1/10 18:12:24
国外网站推荐,seo网站图片优化,设计签名的软件,可以直接打开的网页箭头函数的 this 为什么不会变#xff1f;一文讲透它的底层逻辑你有没有遇到过这样的场景#xff1a;setTimeout(function() {console.log(this.name); // undefined#xff0c;不是想要的结果 }, 1000);明明this应该指向某个对象#xff0c;结果却丢了#xff1f;这在 Ja…箭头函数的 this 为什么不会变一文讲透它的底层逻辑你有没有遇到过这样的场景setTimeout(function() { console.log(this.name); // undefined不是想要的结果 }, 1000);明明this应该指向某个对象结果却丢了这在 JavaScript 开发中太常见了。为了解决这个问题我们曾用各种“土办法”var self this; // 或者 that.doSomething.bind(this)直到ES6 箭头函数出现——它让这一切变得简单而自然。但问题是为什么箭头函数的this就不会丢它是怎么做到的今天我们就来彻底拆解这个机制不绕弯子直击本质。从一个经典问题说起回调中的 this 去哪了假设我们有一个用户对象想延迟打印他的名字const user { name: Alice, greetLater: function() { setTimeout(function() { console.log(Hello, ${this.name}); // 输出: Hello, undefined }, 1000); } }; user.greetLater();输出是Hello, undefined而不是Hello, Alice。为什么因为setTimeout的回调是一个独立函数调用此时this不再绑定到user而是根据执行环境决定非严格模式下为window严格模式下为undefined。这就是所谓的“上下文丢失”。解法一缓存 this老派做法greetLater: function() { const self this; // 缓存外层 this setTimeout(function() { console.log(Hello, ${self.name}); // 使用缓存变量 }, 1000); }可行但多了一层变量代码略显啰嗦。解法二使用 bindgreetLater: function() { setTimeout(function() { console.log(Hello, ${this.name}); }.bind(this), 1000); }也行得通但.bind(this)显得冗余。解法三箭头函数现代写法greetLater: function() { setTimeout(() { console.log(Hello, ${this.name}); // 直接用 this没问题 }, 1000); }✅ 成功输出Hello, Alice。关键点在于这个this并不属于箭头函数本身而是继承自外层普通函数greetLater的this。真相揭晓箭头函数根本没有自己的 this这是理解整个机制的核心一句话箭头函数没有自己的this绑定。它的this是词法继承自外层作用域的。什么意思普通函数的this是在运行时动态绑定的取决于你怎么调用它。箭头函数的this是在定义时静态确定的完全由它被写在哪里决定。换句话说你不能通过.call()、.apply()或.bind()改变箭头函数的this因为它压根就不关心这些调用方式。实验验证const context { name: Bob }; const arrowFunc () console.log(this.name); // 尝试强行改变 this arrowFunc.call(context); // 依然输出 window.name 或 undefined你会发现无论你怎么调用this都不变。因为它根本没把自己放进执行上下文中去绑定。词法作用域 vs 动态作用域一次说清区别类型绑定时机决定因素典型代表动态绑定运行时调用方式普通函数词法绑定定义时所在位置箭头函数举个生活化的比喻动态绑定就像快递员送货他去哪取决于订单地址调用方式词法绑定像是孩子叫“爸爸”不管他在哪里说话指的都是亲爹定义时的作用域。所以当你在user.greetLater方法里写了一个箭头函数里面的this指的就是greetLater的this—— 即user对象。常见误区澄清对象字面量不是作用域很多人会犯这样一个错误const obj { name: Charlie, sayName: () { console.log(this.name); // ❌ 输出 undefined } }; obj.sayName();他们以为sayName是obj的方法this就应该指向obj。错记住对象字面量{}不构成作用域。箭头函数查找this时是沿着词法作用域链向上找直到找到最近的非箭头函数环境。在这个例子中sayName外面没有函数包裹所以它的this指向的是全局作用域浏览器中是window和obj毫无关系。✅ 正确做法是使用普通函数或类方法const obj { name: Charlie, sayName() { // 或者写成 sayName: function() console.log(this.name); // ✅ 输出 Charlie } };箭头函数还有哪些“缺失”的特性除了没有自己的this箭头函数还少了几个传统函数的关键部件特性是否存在替代方案this绑定❌ 无继承外层arguments对象❌ 无使用...args剩余参数prototype属性❌ 无不能作为构造函数super访问❌ 无不适用于类方法构造调用new❌ 抛错必须用普通函数这也意味着箭头函数不适合用来定义对象方法或构造函数。但它非常适合用于数组高阶方法中的回调异步任务的闭包回调需要保持父级上下文的嵌套函数实战应用什么时候该用箭头函数✅ 推荐使用场景1. 数组遍历回调const numbers [1, 2, 3]; const user { prefix: Number:, logAll() { numbers.forEach(n { console.log(${this.prefix} ${n}); // ✅ this 正常访问 }); } };简洁又安全。2. React 事件处理器类组件class MyComponent extends Component { state { count: 0 }; handleClick () { this.setState({ count: this.state.count 1 }); // 自动绑定 this } render() { return button onClick{this.handleClick}/button; } }避免了手动bind或生命周期中绑定的麻烦。3. Promise 链式调用fetch(/api/user) .then(res res.json()) .then(data { this.updateProfile(data); // 保留组件上下文 });不用担心this丢失。❌ 不推荐使用场景1. 对象方法再次强调const calculator { value: 0, add: (num) { // ❌ 错误 this.value num; // this 不指向 calculator } };应改为add(num) { this.value num; }2. DOM 事件监听器某些情况button.addEventListener(click, () { console.log(this); // 指向外层作用域不是 button 元素 });如果你需要this指向触发元素如 jQuery 插件风格就不能用箭头函数。深层原理V8 是如何实现的虽然 ES 规范层面我们已经清楚了行为规则但从引擎角度看箭头函数在创建时不生成新的[[ThisBinding]]记录。当 JavaScript 引擎执行到箭头函数内部的this表达式时查找标识符this发现当前执行上下文没有this绑定向上遍历词法环境链Lexical Environment Chain找到第一个提供this绑定的外围函数环境使用那个this这个过程类似于变量查找只不过针对的是特殊关键字this。因此箭头函数本质上是一种语法糖级别的作用域继承机制而非真正的函数行为扩展。最佳实践建议场景推荐写法原因对象方法普通函数 / 方法简写确保正确绑定this构造函数function或class箭头函数不支持new回调函数箭头函数自然捕获外层上下文工具函数模块顶层箭头函数若无需this更简洁一致高阶函数返回函数看需求选择若需保留调用者上下文慎用箭头函数总结一下核心要点箭头函数没有自己的this它只是“借”了外层的。它的this是词法绑定在定义时就决定了无法被.call()修改。对象字面量不是作用域所以在里面用箭头函数拿不到对象本身的this。它不能做构造函数也没有arguments和prototype。最适合用在回调、闭包、需要保持上下文的嵌套函数中。掌握了这一点你就真正理解了现代 JavaScript 中最常用也最容易误解的语言特性之一。下次当你看到一段箭头函数里的this别再疑惑它指向谁了——看看它写在哪它的爸爸就是谁。如果你在项目中还在频繁使用self this或.bind(this)不妨回头看看是不是可以用箭头函数更优雅地解决欢迎在评论区分享你的实际踩坑经历或优化案例
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站界面分析sae更新wordpress

消费级NVIDIA显卡解锁vGPU虚拟化完整指南 【免费下载链接】vgpu_unlock Unlock vGPU functionality for consumer grade GPUs. 项目地址: https://gitcode.com/gh_mirrors/vg/vgpu_unlock 想要在普通消费级显卡上体验企业级的GPU虚拟化技术吗?vgpu_unlock这个…

张小明 2026/1/7 20:48:07 网站建设

网站的服务有哪些网站设置多少个关键词

第一章:Open-AutoGLM本地部署概述Open-AutoGLM 是一个开源的自动化代码生成语言模型系统,支持基于自然语言描述生成高质量代码片段。在本地环境中部署该模型,能够保障数据隐私、提升响应速度,并允许深度定制化开发流程。本章介绍其…

张小明 2026/1/7 13:20:56 网站建设

企业网站软件下载wordpress 改ip

基于单片机家庭安全监控/安全防护设计-仿真原理图程序 主要功能:温度检测、火焰报警、PM2.5检测、按键设置 仿真、原理图、程序家是我们温馨的港湾,保障家庭安全至关重要。今天咱们就来聊聊如何用单片机打造一个家庭安全监控系统,它能实现温度…

张小明 2026/1/9 21:22:27 网站建设

那方面 搜索网站网站备案管理系统网站

第一章:还在手动填表?Open-AutoGLM浏览器助手一键自动提交表单(真实案例演示)痛点场景还原 每天重复填写相同的报名表、登录表单或内部系统工单,不仅耗时还容易出错。某企业行政人员小李曾需手动为新员工在5个不同平台…

张小明 2026/1/7 19:31:40 网站建设

网站设计需要那些人wordpress 粘贴表格

46.3%准确率突破!DeepSeek-Prover-V1用合成数据改写数学证明自动化 【免费下载链接】DeepSeek-Prover-V1 通过大规模合成数据,DeepSeek-Prover-V1 提升了语言模型在定理证明领域的表现,翻译数学竞赛题目生成 Lean 4 证明数据,实现…

张小明 2026/1/9 19:12:11 网站建设

架设一个网站祖庙网站开发

Transformer 模型上下文理解能力实测(基于 TensorFlow 2.9) 在当今自然语言处理领域,模型能否真正“理解”语义上下文,已成为衡量其智能水平的关键标准。传统序列模型如 LSTM 虽能捕捉局部依赖,但在长距离语义关联上常…

张小明 2026/1/9 7:33:03 网站建设