箭头函数 vs 普通函数:前端新人别再被 this 搞懵了!


箭头函数 vs 普通函数:前端新人别再被 this 搞懵了!

  • 箭头函数 vs 普通函数:前端新人别再被 this 搞懵了!
    • 先整点废话,不然不长记性
    • 混个脸熟:箭头函数到底长啥样?
    • this 的归属权大战:谁调用我 vs 我在哪出生
      • 普通函数:谁最后点我,我就是谁的 this
      • 箭头函数:我在哪儿定义,this 就永远锁死在外层
      • 真实翻车现场 1:定时器里写箭头,this 直接蒸发
      • 真实翻车现场 2:React 类组件事件里用普通函数,this 失踪
    • arguments 对象?箭头函数说:我没见过这玩意儿
    • 不能当构造函数:new 一个箭头函数,浏览器直接甩脸
    • super 和 new.target:箭头函数表示我借不到
    • 实战:到底哪里该用谁?一张表给你整明白
    • 排查 this 不对劲的三板斧
    • 小机灵鬼技巧合集
      • 1. forEach 里再也不用写 `const that = this`
      • 2. 立即执行箭头函数,做模块隔离
      • 3. 统一工具库风格,全箭头,可读性高
      • 4. 骚操作:用箭头函数写“自解耦”定时器
    • 彩蛋时间:你以为箭头函数不能 async?错!
    • 最后一碗毒鸡汤

箭头函数 vs 普通函数:前端新人别再被 this 搞懵了!

友情提示:本文全程口语化,代码管饱,吐槽拉满,建议配着肥宅快乐水服用,边喝边骂“卧槽原来如此”。


先整点废话,不然不长记性

那天凌晨一点,我盯着屏幕上的Cannot read property 'setState' of undefined发呆,心里把 React 作者全家问候了个遍。结果第二天早上一查,罪魁祸首居然是我自己写的箭头函数——写是写得爽,this 直接原地蒸发。那一刻我悟了:不是所有长得像函数的玩意儿,都能当函数使。


混个脸熟:箭头函数到底长啥样?

先别整那些八股定义,咱直接上代码,一眼看出谁是谁:

// 普通函数,老派写法functionadd(a,b){returna+b;}// 箭头函数,新式写法constadd=(a,b)=>a+b;

看着差不多,但坑就藏在“差不多”里。给你几个“简写陷阱”,踩过的人才懂:

// 1. 单参数,括号可省,但别省出歧义constdouble=x=>x*2;// OKconstdouble=(x)=>x*2;// 也 OK,看心情// 2. 多行语句,必须加大括号,否则隐式 return 给你 undefinedconstcalc=(a,b)=>{// 大括号一出现,return 就得手写constsum=a+b;returnsum*2;};// 3. 返回对象字面量,括号不能省,否则语法报错constgetUser=()=>({name:'kimi',age:18});// 小括号保命

小总结:箭头函数省字符,但省得太多,浏览器就帮你“省”掉工资。


this 的归属权大战:谁调用我 vs 我在哪出生

普通函数:谁最后点我,我就是谁的 this

constobj={name:'obj',normalFn:function(){console.log(this.name);}};obj.normalFn();// 'obj',没毛病

箭头函数:我在哪儿定义,this 就永远锁死在外层

constobj={name:'obj',arrowFn:()=>{console.log(this.name);// 外层是 window,this === window}};obj.arrowFn();// undefined(浏览器里 window.name 是空)

真实翻车现场 1:定时器里写箭头,this 直接蒸发

classCounter{constructor(){this.count=0;// 错误示范:箭头函数把 this 绑死在 windowsetInterval(()=>{this.count++;// 这里 this 其实是 Counter 实例,因为定义在构造函数里console.log(this.count);},1000);}}

等等,上面这段居然能跑?对,因为箭头函数定义在 constructor 内部,外层 this 就是实例。
但如果把箭头函数写到原型链上,再拿去当回调,就全凉了——后面 class 章节给你演示。

真实翻车现场 2:React 类组件事件里用普通函数,this 失踪

class Button extends React.Component { state = { clicks: 0 }; // 普通函数:事件回调里 this === undefined(严格模式) handleClick() { this.setState({ clicks: this.state.clicks + 1 }); // 报错 } render() { return <button onClick={this.handleClick}>点我</button>; } }

解决姿势三选一:

// 1. 构造函数里手动 bind(老干部写法) constructor() { super(); this.handleClick = this.handleClick.bind(this); } // 2. 类字段 + 箭头函数(现在最流行) handleClick = () => { this.setState({ clicks: this.state.clicks + 1 }); }; // 3. 回调里直接包箭头(适合一次性) onClick={() => this.handleClick()}

arguments 对象?箭头函数说:我没见过这玩意儿

普通函数自带arguments,长得像数组,其实是对象,坑死强迫症:

functionsum(){// 不是数组,不能用 mapconsole.log(arguments);// { '0': 1, '1': 2, '2': 3 }returnArray.from(arguments).reduce((a,b)=>a+b,0);}sum(1,2,3);// 6

箭头函数里写arguments会直接引用外层,一不留神就全局翻车:

constsum=()=>{console.log(arguments);// 引用外层,浏览器里就是 window.arguments,undefined};

正确姿势:用 rest 参数,真·数组,真·香:

constsum=(...nums)=>nums.reduce((a,b)=>a+b,0);sum(1,2,3);// 6

不能当构造函数:new 一个箭头函数,浏览器直接甩脸

constPerson=(name)=>{this.name=name;};constp=newPerson('kimi');// TypeError: Person is not a constructor

为啥?

  1. 箭头函数没有prototype属性,引擎层面就禁止[[Construct]]
  2. 设计者初衷:箭头函数只做“轻量匿名回调”,不想让你搞出花来。

super 和 new.target:箭头函数表示我借不到

普通函数里你可以:

classA{constructor(){console.log(new.target);// 指向真正被 new 的构造函数}}

箭头函数里写new.target会直接报错——它压根就没有自己的执行上下文,全蹭外层的。
继承场景下更惨:

classA{foo(){return()=>{console.log(super.bar);// 报错,箭头函数没有 super};}}

实战:到底哪里该用谁?一张表给你整明白

场景推荐理由
React 类组件事件处理器箭头函数(类字段写法)自动锁 this,不写 bind
对象方法普通函数需要动态 this
定时器/延时器回调箭头函数继承外层 this,省 bind
构造函数普通函数箭头函数不能 new
数组高阶方法回调箭头函数简短、无 this 绑定需求
需要 arguments普通函数 或 rest箭头函数无 arguments
类的方法(原型链)普通函数让子类可重写,避免 this 固化

排查 this 不对劲的三板斧

  1. 看函数是不是箭头:是箭头就死心吧,this 改不了。
  2. 看定义位置:箭头函数锁死外层 this,普通函数看调用。
  3. 看调用方式:有没有.bind(obj).call(obj).apply(obj)

快速调试黑魔法:

// 在可疑位置插桩console.log('当前 this 是:',this);// 浏览器里直接打断点,观察 Scope 链

小机灵鬼技巧合集

1. forEach 里再也不用写const that = this

// ES5 时代constthat=this;arr.forEach(function(item){that.doSomething(item);});// 现在arr.forEach(item=>this.doSomething(item));

2. 立即执行箭头函数,做模块隔离

constutils=(()=>{constsecret='2333';return{getSecret:()=>secret};})();console.log(utils.getSecret());// 2333

3. 统一工具库风格,全箭头,可读性高

exportconstpipe=(...fns)=>x=>fns.reduce((v,f)=>f(v),x);exportconstdebounce=(fn,ms)=>{letid;return(...args)=>{clearTimeout(id);id=setTimeout(()=>fn(...args),ms);};};

4. 骚操作:用箭头函数写“自解耦”定时器

classSlider{start(){this.timer=setInterval(()=>{this.next();// this 永远是实例,不怕被换掉},3000);}next(){console.log('next slide');}}

彩蛋时间:你以为箭头函数不能 async?错!

// 完全可以,但别写换行搞混constfetchUser=asyncid=>{constres=awaitfetch(`/api/user/${id}`);returnres.json();};

Generator 才真的不行——因为箭头函数不能用yield

constgen=*()=>{yield1;};// SyntaxError

最后一碗毒鸡汤

箭头函数就像泡面:方便、省事儿,但天天吃会营养不良。
普通函数像自己下厨:麻烦、锅碗瓢盆,但想炒啥都行。
写代码别炫技,可读性第一,性能第二,炫技排最后。
记住:当你纠结“用箭头还是普通”时,先问自己——“我需不需要动态 this?”
一句话总结:
要绑死 this → 箭头;要动态 this → 普通;要 new → 普通;要 arguments → 普通或 rest。
背不下来?抄桌子板上,下次报错直接翻,别再凌晨一点骂娘了。

写完收工,键盘上都是头发,点个赞再走吧,祝你永远不写undefined of undefined

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》持续更新中~结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》持续更新中~AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。
通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》持续更新中~Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》持续更新中~SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》持续更新中~算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》持续更新中~基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1128586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广告公司降本增效:Z-Image-Turbo替代商用AI绘图软件

广告公司降本增效&#xff1a;Z-Image-Turbo替代商用AI绘图软件 在广告创意行业中&#xff0c;视觉内容的快速产出是项目推进的核心环节。传统依赖设计师手动绘制或使用Adobe系列工具进行图像设计的方式&#xff0c;已难以满足高频、多变、低成本的内容需求。近年来&#xff0…

未来工作流:Z-Image-Turbo接入企业CMS内容管理系统

未来工作流&#xff1a;Z-Image-Turbo接入企业CMS内容管理系统 引言&#xff1a;AI图像生成如何重塑内容生产流程 在数字化内容爆炸式增长的今天&#xff0c;企业对高质量视觉素材的需求日益迫切。传统设计流程依赖人工创作&#xff0c;周期长、成本高、难以规模化。随着AIGC…

地理信息+AI跨界指南:MGeo预装环境快速入门

地理信息AI跨界指南&#xff1a;MGeo预装环境快速入门 作为一名GIS开发者&#xff0c;你是否遇到过这样的困境&#xff1a;想要将先进的AI能力集成到ArcGIS工作流中&#xff0c;却在Python深度学习环境搭建环节卡壳&#xff1f;特别是torch-geometric这类依赖复杂的库&#xff…

Mac 用户久等了!节点小宝 4.0 macOS版,正式登陆!

历经打磨与等待&#xff0c;节点小宝 4.0 的 macOS 客户端 现已正式发布&#xff01;无论你用的是 iPhone、iPad 还是 MacBook&#xff0c;现在都能通过全新的 4.0 版本&#xff0c;获得统一、流畅且强大的跨设备远程体验。是时候让你的苹果生态实现真正的连接自由了。对于许多…

告别地址混乱:三步搭建基于MGeo的智能地址标准化服务

告别地址混乱&#xff1a;三步搭建基于MGeo的智能地址标准化服务 在电商平台的日常运营中&#xff0c;地址信息处理一直是个令人头疼的问题。用户填写的地址往往五花八门——"朝阳区"写成"朝陽區"&#xff0c;"海淀区"简化为"HD区"&am…

Z-Image-Turbo千里江山图青绿山水模仿测试

Z-Image-Turbo千里江山图青绿山水模仿测试 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 运行截图 本文为Z-Image-Turbo在传统中国画风格复现中的实践探索。我们将以《千里江山图》为灵感&#xff0c;结合“青绿山水”艺术特征&#xff0c;通过提示词工程…

1天搞定数据中台原型:EASYPOI快速验证方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个数据中台快速原型系统&#xff0c;核心功能&#xff1a;1.基于EASYPOI的多格式数据导入&#xff08;Excel/CSV&#xff09;&#xff1b;2.字段映射和转换配置界面&#xf…

如何用AI快速诊断JVM虚拟机初始化错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Java虚拟机错误诊断工具&#xff0c;能够自动分析ERROR OCCURRED DURING INITIALIZATION OF VM类错误。要求&#xff1a;1. 解析错误日志&#xff0c;识别关键错误信息&am…

Z-Image-Turbo备份策略:重要生成结果保护方案

Z-Image-Turbo备份策略&#xff1a;重要生成结果保护方案 引言&#xff1a;AI图像生成中的数据价值与风险 随着阿里通义Z-Image-Turbo WebUI在创意设计、产品原型和内容生产领域的广泛应用&#xff0c;用户通过精细调参和多次迭代生成的高质量图像已成为极具价值的数字资产。这…

Z-Image-Turbo网络隔离环境下的离线使用方案

Z-Image-Turbo网络隔离环境下的离线使用方案 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在企业级AI部署场景中&#xff0c;数据安全与网络隔离是核心要求。阿里通义推出的 Z-Image-Turbo 模型凭借其高效的推理速度和高质量的图像生成能力&#xff0c;…

3.19 Airbnb个性化推荐场景:传统企业的千人十面推荐策略

3.19 Airbnb个性化推荐场景:传统企业的千人十面推荐策略 引言 Airbnb的个性化推荐系统是传统企业应用推荐算法的典型案例。本文将深入解析Airbnb的推荐策略,从业务场景到技术实现。 一、业务场景 1.1 Airbnb推荐场景 # Airbnb推荐场景 def airbnb_scenarios():"&qu…

MGeo+知识图谱:从地址文本到空间关系的智能解析

MGeo知识图谱&#xff1a;从地址文本到空间关系的智能解析 在城市规划工作中&#xff0c;我们经常需要从政策文档、项目报告等文本中提取空间关系信息&#xff0c;比如"XX项目位于A区与B区交界处"这类描述。传统的人工标注方式效率低下&#xff0c;而MGeo知识图谱技术…

IDEA AI插件实战:从零搭建智能代码审查工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于IDEA的AI插件&#xff0c;用于自动化代码审查。插件应能分析代码复杂度、重复代码、潜在性能问题&#xff0c;并提供具体的优化建议。支持生成可视化报告&#xff0c;…

M2FP镜像优势解析:比GitHub原版更稳定、更易用

M2FP镜像优势解析&#xff1a;比GitHub原版更稳定、更易用 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将人体分解为多个语义明确的…

Z-Image-Turbo开发者联系方式获取途径

Z-Image-Turbo开发者联系方式获取途径 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 运行截图 在AI图像生成技术迅猛发展的当下&#xff0c;阿里通义实验室推出的Z-Image-Turbo凭借其高效的推理速度与高质量的图像输出能力&#xff0c;迅速成为开发者社区…

MGeo模型解读与实战:免配置环境下的理论与代码结合

MGeo模型解读与实战&#xff1a;免配置环境下的理论与代码结合 为什么需要MGeo模型&#xff1f; 在日常工作和生活中&#xff0c;我们经常会遇到需要从非结构化文本中提取地理信息的场景。比如物流订单中的地址识别、社交媒体中的位置标注、或是政务文档中的行政区划提取。传统…

3.17 基于DNN的推荐系统架构:深度学习在推荐系统中的实战应用

3.17 基于DNN的推荐系统架构:深度学习在推荐系统中的实战应用 引言 深度学习在推荐系统中应用越来越广泛,DNN(深度神经网络)可以学习复杂的特征交互和表示。本文将深入解析基于DNN的推荐系统架构。 一、DNN推荐架构 1.1 整体架构 #mermaid-svg-0jkBe6TeJTSvjx8L{font-f…

AI医疗插图生成:Z-Image-Turbo辅助医学教育

AI医疗插图生成&#xff1a;Z-Image-Turbo辅助医学教育 引言&#xff1a;AI图像生成如何重塑医学可视化教学 在医学教育中&#xff0c;高质量的解剖示意图、病理过程图和手术流程图是不可或缺的教学资源。然而&#xff0c;传统医学插图依赖专业画师手工绘制&#xff0c;周期长…

5分钟搭建Git冲突演示环境

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个快速生成Git冲突演示环境的工具。功能包括&#xff1a;1) 一键创建测试仓库 2) 预设多种冲突场景 3) 自动生成冲突文件 4) 重置环境功能 5) 导出测试用例。使用Shell脚本实…

华为发布HUAWEI P50 Pocket,带来智慧时尚的数字生活体验

华为鸿蒙harmonyos官网 12月23日&#xff0c;华为发布全新旗舰折叠屏手机HUAWEIP50Pocket&#xff0c;继承华为P系列基因&#xff0c;探索科技美学与智慧影像的新突破。HUAWEIP50Pocket实现P系列手机美学新高度&#xff0c;并尝试科技与艺术跨界融合&#xff0c;携手国际知名高…