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使用技巧简单汇总
Apr 18 Javascript
Vue.JS入门教程之事件监听
Dec 01 Javascript
如何理解Vue的render函数的具体用法
Aug 30 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
详解angular2.x创建项目入门指令
Oct 11 Javascript
vue+element-ui表格封装tag标签使用插槽
Jun 18 Javascript
js 执行上下文和作用域的相关总结
Feb 08 Javascript
关于Javascript闭包与应用的详解
Apr 22 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 define()函数及defined()函数使用详解
2013/06/09 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
JavaScript 的继承
2011/10/01 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
Python中分数的相关使用教程
2015/03/30 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
python中管道用法入门实例
2015/06/04 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
python+opencv实现车道线检测
2021/02/19 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
css图标制作教程制作云图标
2014/01/19 HTML / CSS
集体备课反思
2014/02/12 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
法人委托书
2014/07/31 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python