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 相关文章推荐
js左侧多级菜单动态的解决方案
Feb 01 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
Apr 21 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
JavaScript中reduce()方法的使用详解
Jun 09 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
超实用的JavaScript代码段 附使用方法
May 22 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 Javascript
vue debug 二种方法
Sep 16 Javascript
发布Angular应用至生产环境的方法
Dec 10 Javascript
JavaScript Math对象和调试程序的方法分析
May 13 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 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 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
js左侧三级菜单导航实例代码
2013/09/13 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
师范毕业生个人求职信
2013/12/09 职场文书
毕业设计计划书
2014/01/09 职场文书
材料加工工程求职信
2014/02/19 职场文书
劲霸男装广告词改编版
2014/03/21 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
python文件与路径操作神器 pathlib
2022/04/01 Python