最近被问到了一个问题:

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小时内与您取得联系。