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 相关文章推荐
javascript中创建对象的三种常用方法
Dec 30 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
jQuery中delegate和on的用法与区别详细解析
Jan 26 Javascript
JS图片无缝、平滑滚动代码
Mar 11 Javascript
JavaScript设计模式之代理模式介绍
Dec 28 Javascript
使用JavaScript实现连续滚动字幕效果的方法
Jul 07 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
AngularJS入门教程之模块化操作用法示例
Nov 02 Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
Jan 09 jQuery
element-ui组件table实现自定义筛选功能的示例代码
Mar 15 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
解析thinkphp的左右值无限分类
2013/06/20 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
Document 对象的常用方法
2009/07/31 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
详解python之配置日志的几种方式
2017/05/22 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
入党现实表现材料
2014/12/23 职场文书
社区服务活动报告
2015/02/05 职场文书
银行资信证明
2015/06/17 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL