javascript箭头函数是什么_它和普通函数有哪些区别?

发布时间 - 2026-01-04 00:00:00    点击率:
箭头函数没有自己的this,继承外层词法作用域的this;不能用作构造函数,无prototype、arguments、caller、callee、yield,也不支持new调用,适用于无需独立this和构造能力的场景。

箭头函数没有自己的 this,它继承外层作用域的 this

这是最常踩坑的一点。普通函数的 this 在调用时动态绑定(取决于怎么调用),而箭头函数压根不绑定 this,它直接从定义时的词法作用域向上查找 this 值。

典型问题场景:给 DOM 元素绑定事件、在对象方法中使用定时器、Vue/React 组件里写回调。

  • 普通函数:
    const obj = {
      name: 'Alice',
      say: function() { console.log(this.name) }
    }
    obj.say() // 'Alice';但 setTimeout(obj.say, 100) 会输出 undefined(因为 this 指向全局)
  • 箭头函数:
    const obj = {
      name: 'Alice',
      say: () => { console.log(this.name) } // 这里的 this 是定义时外层的 this,不是 obj
    }
    // 即使调用 obj.say(),也几乎肯定不是你想要的结果

箭头函数不能用作构造函数,也没有 prototypearguments

它没有 [[Construct]] 内部方法,所以不能用 new 调用;同时没有 prototype 属性,也不能被原型链继承;也没有独立的 arguments 对象(得靠 rest 参数 ...args 替代)。

  • 报错示例:
    const Arrow = () => {}
    new Arrow() // TypeError: Arrow is not a constructor
  • 替代 arguments
    function old(a, b) { console.log(arguments[0]) }
    const arrow = (...args) => { console.log(args[0]) }

箭头函数没有 argumentscallercallee,也不支持 yield

这些是普通函数的特有属性或能力。箭头函数设计初衷就是“轻量级函数表达式”,不承担构造、动态参数捕获或协程职责。

  • arguments 不可用 → 必须用 rest 参数;
  • caller/callee 在严格模式下本就禁用,但箭头函数彻底没这俩属性;
  • yield 不能用 → 要写生成器必须用 function*,不能写 () => yield
  • 没有 name 属性(或为 ""),调试时堆栈里显示为 anonymous

什么时候该用箭头函数?记住两个关键信号

一是「不需要自己的 this」,二是「不需要被 new 调用」。常见于:数组方法回调(map/filter/reduce)、事件监听器(当需要闭包访问外层变量时)、Promise 链中的 then 回调。

  • 推荐用法:
    [1, 2, 3].map(x => x * 2)
    button.addEventListener('click', () => this.handleClick()) // this 指向组件实例
  • 不该用的场景:
    const utils = {
      now() { return Date.now() },
      delay: () => setTimeout(this.now, 100) // ❌ this.now 是 undefined,因为箭头函数的 this 不是 utils

真正容易被忽略的是:箭头函数的简洁性会掩盖它对执行上下文的“无感”——它不关心你怎么调用它,只认自己出生的地方。写之前先问一句:这里需要自己的 this 吗?需要被 new 吗?需要动态参数吗?答案只要有一个“是”,就别用箭头函数。


# vue  # react  # javascript  # java  #   # 区别  # 作用域  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 米侠浏览器网页图片不显示怎么办 米侠图片加载修复  php打包exe后无法访问网络共享_共享权限设置方法【教程】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何用花生壳三步快速搭建专属网站?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  javascript中的try catch异常捕获机制用法分析  JS中对数组元素进行增删改移的方法总结  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何解决hover在ie6中的兼容性问题  如何在服务器上配置二级域名建站?  Bootstrap整体框架之JavaScript插件架构  html5的keygen标签为什么废弃_替代方案说明【解答】  如何在阿里云ECS服务器部署织梦CMS网站?  如何在建站主机中优化服务器配置?  如何续费美橙建站之星域名及服务?  香港服务器租用费用高吗?如何避免常见误区?  如何在景安服务器上快速搭建个人网站?  香港服务器部署网站为何提示未备案?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Mybatis 中的insertOrUpdate操作  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何确认建站备案号应放置的具体位置?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  jquery插件bootstrapValidator表单验证详解  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Python高阶函数应用_函数作为参数说明【指导】  如何彻底卸载建站之星软件?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel如何优化应用性能?(缓存和优化命令)  Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  简单实现Android文件上传  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何将凡科建站内容保存为本地文件?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  详解jQuery停止动画——stop()方法的使用  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Bootstrap CSS布局之列表  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Android GridView 滑动条设置一直显示状态(推荐)  Laravel如何使用Eloquent进行子查询  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  海南网站制作公司有哪些,海口网是哪家的?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何实现javascript表单验证_正则表达式有哪些实用技巧