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实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
jQuery 使用手册(一)
Sep 23 Javascript
javascript showModalDialog模态对话框使用说明
Dec 31 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
微信小程序 获取相册照片实例详解
Nov 16 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
Apr 07 Javascript
jQuery之动画ajax事件(实例讲解)
Jul 18 jQuery
微信小程序和百度的语音识别接口详解
May 06 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
Sep 28 Javascript
javascript使用Blob对象实现的下载文件操作示例
Apr 18 Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 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
ucenter通信原理分析
2015/01/09 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
PHP二维数组去重算法
2016/12/17 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
JS 控制小数位数的实现代码
2011/08/02 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
layui清除radio的选中状态实例
2019/11/14 Javascript
JS实现吸顶特效
2020/01/08 Javascript
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
Android笔试题总结
2014/11/29 面试题
党员自我剖析材料(群众路线)
2014/10/06 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
优质服务标语口号
2015/12/26 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
JavaScript 定时器详情
2021/11/11 Javascript