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下为Event handler传递动态参数的代码
Jan 06 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
用js模拟struts2的多action调用示例
May 19 Javascript
js实现编辑div节点名称的方法
Dec 17 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
Aug 24 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
js处理包含中文的字符串实例
Oct 11 Javascript
vue实现前进刷新后退不刷新效果
Jan 26 Javascript
原生js实现省市区三级联动代码分享
Feb 12 Javascript
Vue多系统切换实现方案
Jun 05 Javascript
js+css实现扇形导航效果
Aug 18 Javascript
详解datagrid使用方法(重要)
Nov 06 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
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
php程序内部post数据的方法
2015/03/31 PHP
php抽象类用法实例分析
2015/07/07 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
python实现拓扑排序的基本教程
2018/03/11 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
Python类的继承、多态及获取对象信息操作详解
2019/02/28 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Python any()函数的使用方法
2019/10/28 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
python如何写try语句
2020/07/14 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
init进程的作用
2015/08/20 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
社会实践感言
2014/01/25 职场文书
校园环保建议书
2014/05/14 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书