2026/4/18 17:06:05
网站建设
项目流程
网站空间名,工商年报网上申报系统官网,网站设计案例分析,重庆网站公司制作价格箭头函数 vs 普通函数#xff1a;前端新人别再被 this 搞懵了#xff01;箭头函数 vs 普通函数#xff1a;前端新人别再被 this 搞懵了#xff01;先整点废话#xff0c;不然不长记性混个脸熟#xff1a;箭头函数到底长啥样#xff1f;this 的归属权大战#xff1a;谁调…箭头函数 vs 普通函数前端新人别再被 this 搞懵了箭头函数 vs 普通函数前端新人别再被 this 搞懵了先整点废话不然不长记性混个脸熟箭头函数到底长啥样this 的归属权大战谁调用我 vs 我在哪出生普通函数谁最后点我我就是谁的 this箭头函数我在哪儿定义this 就永远锁死在外层真实翻车现场 1定时器里写箭头this 直接蒸发真实翻车现场 2React 类组件事件里用普通函数this 失踪arguments 对象箭头函数说我没见过这玩意儿不能当构造函数new 一个箭头函数浏览器直接甩脸super 和 new.target箭头函数表示我借不到实战到底哪里该用谁一张表给你整明白排查 this 不对劲的三板斧小机灵鬼技巧合集1. forEach 里再也不用写 const that this2. 立即执行箭头函数做模块隔离3. 统一工具库风格全箭头可读性高4. 骚操作用箭头函数写“自解耦”定时器彩蛋时间你以为箭头函数不能 async错最后一碗毒鸡汤箭头函数 vs 普通函数前端新人别再被 this 搞懵了友情提示本文全程口语化代码管饱吐槽拉满建议配着肥宅快乐水服用边喝边骂“卧槽原来如此”。先整点废话不然不长记性那天凌晨一点我盯着屏幕上的Cannot read property setState of undefined发呆心里把 React 作者全家问候了个遍。结果第二天早上一查罪魁祸首居然是我自己写的箭头函数——写是写得爽this 直接原地蒸发。那一刻我悟了不是所有长得像函数的玩意儿都能当函数使。混个脸熟箭头函数到底长啥样先别整那些八股定义咱直接上代码一眼看出谁是谁// 普通函数老派写法functionadd(a,b){returnab;}// 箭头函数新式写法constadd(a,b)ab;看着差不多但坑就藏在“差不多”里。给你几个“简写陷阱”踩过的人才懂// 1. 单参数括号可省但别省出歧义constdoublexx*2;// OKconstdouble(x)x*2;// 也 OK看心情// 2. 多行语句必须加大括号否则隐式 return 给你 undefinedconstcalc(a,b){// 大括号一出现return 就得手写constsumab;returnsum*2;};// 3. 返回对象字面量括号不能省否则语法报错constgetUser()({name:kimi,age:18});// 小括号保命小总结箭头函数省字符但省得太多浏览器就帮你“省”掉工资。this 的归属权大战谁调用我 vs 我在哪出生普通函数谁最后点我我就是谁的 thisconstobj{name:obj,normalFn:function(){console.log(this.name);}};obj.normalFn();// obj没毛病箭头函数我在哪儿定义this 就永远锁死在外层constobj{name:obj,arrowFn:(){console.log(this.name);// 外层是 windowthis window}};obj.arrowFn();// undefined浏览器里 window.name 是空真实翻车现场 1定时器里写箭头this 直接蒸发classCounter{constructor(){this.count0;// 错误示范箭头函数把 this 绑死在 windowsetInterval((){this.count;// 这里 this 其实是 Counter 实例因为定义在构造函数里console.log(this.count);},1000);}}等等上面这段居然能跑对因为箭头函数定义在 constructor 内部外层 this 就是实例。但如果把箭头函数写到原型链上再拿去当回调就全凉了——后面 class 章节给你演示。真实翻车现场 2React 类组件事件里用普通函数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)ab,0);}sum(1,2,3);// 6箭头函数里写arguments会直接引用外层一不留神就全局翻车constsum(){console.log(arguments);// 引用外层浏览器里就是 window.argumentsundefined};正确姿势用 rest 参数真·数组真·香constsum(...nums)nums.reduce((a,b)ab,0);sum(1,2,3);// 6不能当构造函数new 一个箭头函数浏览器直接甩脸constPerson(name){this.namename;};constpnewPerson(kimi);// TypeError: Person is not a constructor为啥箭头函数没有prototype属性引擎层面就禁止[[Construct]]。设计者初衷箭头函数只做“轻量匿名回调”不想让你搞出花来。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 不对劲的三板斧看函数是不是箭头是箭头就死心吧this 改不了。看定义位置箭头函数锁死外层 this普通函数看调用。看调用方式有没有.bind(obj)、.call(obj)、.apply(obj)。快速调试黑魔法// 在可疑位置插桩console.log(当前 this 是,this);// 浏览器里直接打断点观察 Scope 链小机灵鬼技巧合集1. forEach 里再也不用写const that this// ES5 时代constthatthis;arr.forEach(function(item){that.doSomething(item);});// 现在arr.forEach(itemthis.doSomething(item));2. 立即执行箭头函数做模块隔离constutils((){constsecret2333;return{getSecret:()secret};})();console.log(utils.getSecret());// 23333. 统一工具库风格全箭头可读性高exportconstpipe(...fns)xfns.reduce((v,f)f(v),x);exportconstdebounce(fn,ms){letid;return(...args){clearTimeout(id);idsetTimeout(()fn(...args),ms);};};4. 骚操作用箭头函数写“自解耦”定时器classSlider{start(){this.timersetInterval((){this.next();// this 永远是实例不怕被换掉},3000);}next(){console.log(next slide);}}彩蛋时间你以为箭头函数不能 async错// 完全可以但别写换行搞混constfetchUserasyncid{constresawaitfetch(/api/user/${id});returnres.json();};Generator 才真的不行——因为箭头函数不能用yieldconstgen*(){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等工具吾辈才疏学浅摹写之作恐有瑕疵。望诸君海涵赐教。望轻喷嘤嘤嘤非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益纵其简陋未及渊博亦足以略尽绵薄之力。倘若尚存阙漏敬请不吝斧正俾便精进