全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

最近被问到了一个问题:

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普通函数与箭头函数的区别  # 这一  # 绑定  # 很简单  # 所述  # 小编  # 更适合  # 这并  # 自己的  # 都是  # 我想  # 出了  # 我觉得  # 却是  # 在此  # 没有任何  # 但我  # 不是很  # 这个问题  # 是从  # 你有 


相关文章: 实例解析Array和String方法  如何解决ASP生成WAP建站中文乱码问题?  济南网站制作的价格,历城一职专官方网站?  浅析上传头像示例及其注意事项  ,交易猫的商品怎么发布到网站上去?  如何挑选高效建站主机与优质域名?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  外贸公司网站制作哪家好,maersk船公司官网?  如何在腾讯云服务器上快速搭建个人网站?  制作网站公司那家好,网络公司是做什么的?  如何在IIS服务器上快速部署高效网站?  网站专业制作公司有哪些,做一个公司网站要多少钱?  如何在景安云服务器上绑定域名并配置虚拟主机?  网站制作新手教程,新手建设一个网站需要注意些什么?  建站之星如何保障用户数据免受黑客入侵?  如何在万网主机上快速搭建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  定制建站模板如何实现SEO优化与智能系统配置?18字教程  成都网站制作报价公司,成都工业用气开户费用?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  如何在局域网内绑定自建网站域名?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  长沙企业网站制作哪家好,长沙水业集团官方网站?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  中山网站制作网页,中山新生登记系统登记流程?  建站之星上传入口如何快速找到?  金*站制作公司有哪些,金华教育集团官网?  建站ABC备案流程中有哪些关键注意事项?  常州企业建站如何选择最佳模板?  广德云建站网站建设方案与建站流程优化指南  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站主机是否属于云主机类型?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何快速搭建二级域名独立网站?  高防服务器租用指南:配置选择与快速部署攻略  建站VPS能否同时实现高效与安全翻墙?  建站之星与建站宝盒如何选择最佳方案?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  山东网站制作公司有哪些,山东大源集团官网?  如何用花生壳三步快速搭建专属网站?  南平网站制作公司,2025年南平市事业单位报名时间?  如何配置支付宝与微信支付功能?  高端云建站费用究竟需要多少预算?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  ,购物网站怎么盈利呢? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。