JavaScript中的普通函数和箭头函数的区别和用法详解

发布时间 - 2026-01-11 00:16:38    点击率:

最近被问到了一个问题:

javaScript 中的箭头函数 ( => ) 和普通函数 ( function ) 有什么区别?

我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答……

箭头函数中的 this 和调用时的上下文无关,而是取决于定义时的上下文

这并不是很正确的答案……虽然也不是完全错误

箭头函数中的 this

首先说我的回答中没有错误的部分:箭头函数中的 this 确实和调用时的上下文无关

function make () {
  return ()=>{
    console.log(this);
  }
}
const testFunc = make.call({ name:'foo' });
testFunc(); //=> { name:'foo' }
testFunc.call({ name:'bar' }); //=> { name:'foo' }

这个例子可以看到,确实箭头函数在定义之后,this 就不会发生改变了,无论用什么样的方式调用它,this 都不会改变;

但严格来说,这并不是“取决于定义时的上下文”, 因为箭头函数根本就没有绑定自己的 this,在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用罢了;
从效果上看,这和我之前的理解并没有多大偏差,但它们的本质却是截然不同,箭头函数并不是普通函数新增了 this 不受调用时上下文影响的特性,而是减少了很多特性;

箭头函数其实是更简单的函数

实际上箭头函数中并不只是 this 和普通函数有所不同,箭头函数中没有任何像 this 这样自动绑定的局部变量,包括:this,arguments,super(ES6),new.target(ES6)……

借用别人的一个例子:

function foo() {
  setTimeout( () => {
   console.log("args:", arguments);
  },100);
}
foo( 2, 4, 6, 8 );
// args: [2, 4, 6, 8]

在普通函数中,会自动绑定上的各种局部变量,箭头函数都是十分单纯的沿着作用域链向上寻找……

箭头函数就是这么个简单、纯粹的东西;

所以我个人认为箭头函数更适合函数式编程,除了它更短以外,使用箭头函数也更难被那些没有显示声明的变量影响,导致你产生意料之外的计算结果;

那么普通函数能否实现和箭头函数一样的效果呢?

如果是像当初的我一样简单的考虑固定住 this 这个易变的家伙……那倒是很简单,有些常用的方法,比如这样:

function make () {
  var self = this;
  return function () {
    console.log(self);
  }
}

或者

function make () {
  return function () {
    console.log(this);
  }.bind(this);
}

然而第二种方法只能固定 this 这一个变量而已,如前文所述,箭头函数中的 arguments 等变量也是从作用域链中寻找的,为了实现类似的效果,我们只有重新定义一个局部变量这一种方式,而 babel 也是使用这种方式对箭头函数进行处理的。

function make () {
  return ()=>{
    console.log(this);
    console.log(arguments);
  }
}
//babel it...
function make() {
  var _this = this,
    _arguments = arguments;
  return function () {
    console.log(_this);
    console.log(_arguments);
  };
}

那么……如果我想在箭头函数中使用 arguments 该怎么办?

……我觉得如果你有这个需求,可能还是用普通函数更合适一点……

但并不是说在箭头函数中无法以类似数组的形式取到所有参数,我们可以利用展开运算符来接收参数,比如这样:

const testFunc = (...args)=>{
  console.log(args) //数组形式输出参数
}

或许真的有场景需要用到这种写法,但我还是认为,箭头函数更适合那些接受固定的参数,返回一个计算结果的简单情况;

以上所述是小编给大家介绍的JavaScript中的普通函数和箭头函数的区别和用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 普通函数和箭头函数  # js普通函数  # 箭头函数  # 深入理解JavaScript中的箭头函数  # JavaScript箭头(arrow)函数详解  # JavaScript箭头函数中的this详解  # 深入理解Javascript箭头函数中的this  # JS中箭头函数与this的写法和理解  # 深入理解JavaScript 箭头函数  # JavaScript箭头函数的五种使用方法及三点注意事项  # JavaScript中箭头函数与普通函数的区别详解  # 一文彻底讲通JavaScript普通函数与箭头函数的区别  # 这一  # 绑定  # 很简单  # 所述  # 小编  # 更适合  # 这并  # 自己的  # 都是  # 我想  # 出了  # 我觉得  # 却是  # 在此  # 没有任何  # 但我  # 不是很  # 这个问题  # 是从  # 你有 


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


相关推荐: 香港服务器租用每月最低只需15元?  Laravel Session怎么存储_Laravel Session驱动配置详解  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何快速搭建高效服务器建站系统?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何在香港免费服务器上快速搭建网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel如何使用Eloquent进行子查询  开心动漫网站制作软件下载,十分开心动画为何停播?  javascript读取文本节点方法小结  详解Android图表 MPAndroidChart折线图  Laravel如何使用Livewire构建动态组件?(入门代码)  微信小程序 require机制详解及实例代码  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Java垃圾回收器的方法和原理总结  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何批量查询域名的建站时间记录?  深圳网站制作培训,深圳哪些招聘网站比较好?  香港服务器部署网站为何提示未备案?  微信小程序 canvas开发实例及注意事项  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel如何使用Sanctum进行API认证?(SPA实战)  微信公众帐号开发教程之图文消息全攻略  Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何在建站宝盒中设置产品搜索功能?  ,南京靠谱的征婚网站?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  jQuery中的100个技巧汇总  C#如何调用原生C++ COM对象详解  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  装修招标网站设计制作流程,装修招标流程?  如何用美橙互联一键搭建多站合一网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  文字头像制作网站推荐软件,醒图能自动配文字吗?  网站图片在线制作软件,怎么在图片上做链接?  如何彻底卸载建站之星软件?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  MySQL查询结果复制到新表的方法(更新、插入)  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何快速重置建站主机并恢复默认配置?  Laravel storage目录权限问题_Laravel文件写入权限设置