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


Posted in Javascript onMarch 21, 2017

最近被问到了一个问题:

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中的普通函数和箭头函数的区别和用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 Javascript
js展开闭合效果演示代码
Jul 24 Javascript
网页右下角弹出窗体实现代码
Jun 05 Javascript
jquery 实现input输入什么div图层显示什么
Jun 15 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
Aug 10 Javascript
Bootstrap每天必学之js插件
Nov 30 Javascript
详解Layer弹出层样式
Aug 21 Javascript
layui中table表头样式修改方法
Aug 15 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
Vue父组件如何获取子组件中的变量
Jul 24 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
Oct 05 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 #Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 #Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 #Javascript
Bootstrap标签页(Tab)插件使用方法
Mar 21 #Javascript
JavaScript数组和对象的复制
Mar 21 #Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 #Javascript
zTree实现节点修改的实时刷新功能
Mar 20 #Javascript
You might like
BBS(php & mysql)完整版(二)
2006/10/09 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
比较完整的微信开发php代码
2016/08/02 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
vue中使用input[type="file"]实现文件上传功能
2018/09/10 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
新手学python应该下哪个版本
2020/06/11 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
表彰大会主持词
2014/03/26 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle