Javascript中 带名 匿名 箭头函数的重要区别(推荐)


Posted in Javascript onJanuary 29, 2017

带名函数是指函数显示地给出了一个名字的函数,function abs(x){}。匿名函数是指函数只带有function这个关键字,而没有像abs这种函数名称的函数,如function(){}。ES6标准新增了一种新的函数:Arrow Function(箭头函数)箭头函数表面上相当于匿名函数,并且简化了函数定义。它们各自的区别是什么呢?

1 带名和匿名函数的区别

区别:匿名函数需要讲地址赋值给另一个变量let a,然后再用a来调用函数;而带名函数因为显示地给出了函数名称,所以可以直接用这个函数名称调用。

带名函数返回值是函数体内的返回值,如abs(x)函数的返回值是number变量。函数调用时,直接abs(6)调用,这个非常好理解。

function abs(x){
 if(x>=0){
  return x;
 }else{
  return -x;
 }
}

但是匿名函数呢?如下所示,函数未显示地给出一个函数名称,但是此处的abs被赋值为这个匿名函数的地址,所以使用时可以直接用abs(-3),诸如此类的调用。

let abs=function(x){ 
 if(x>=0){
  return x;
 }else{
  return -x;
 }
}

2 箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。为什么叫Arrow Function?因为它的定义用的就是一个箭头。箭头函数表面上相当于匿名函数,并且简化了函数定义。

箭头函数有两种格式,一种是只包含一个表达式,连{ … }和return都省略掉了。

x => x * x

上面的箭头函数相当于一个匿名函数“”

function (x) {
 return x * x;
}

还有一种可以包含多条语句,这时候就不能省略{ … }和return:

(x,y) => {
 if (x > 0) {
  return x + y;
 }
 else {
  return -x + y;
 }
}

3 箭头函数和匿名函数的不同

箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。

调用函数obj1.getAge(2017)和调用obj2.getAge(2017)会得到相同的结果吗?

obj1中fn函数,由于JavaScript函数对this绑定的错误处理,得不到预期的结果,this.birth指向window或undefined。

但是obj2,fn函数是箭头函数,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj2。

var obj1 = {
 birth: 1990,
 getAge: function (year) { 
  let fn=function(y){
   return y - this.birth; // this指向window或undefined
  }; 
  return fn(year); 
 }
};
var obj2 = {
 birth: 1990,
 getAge: function (year) {
  var fn = (y) => y - this.birth; // this.birth为1990
  return fn(year);
 }
};

4 总结

和带名函数相比,匿名函数需要讲地址赋值给另一个变量let a,然后再用a来调用函数;和匿名函数比,箭头函数完全修复了this的指向,this总是指向词法作用域。

以上所述是小编给大家介绍的Javascript中 带名 匿名 箭头函数的重要区别,希望对大家有所帮助,如果有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
Aug 18 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
jquery Easyui快速开发总结
Aug 20 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
vue.js的提示组件
Mar 02 Javascript
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
React-Native之定时器Timer的实现代码
Oct 04 Javascript
jQuery实现的回车触发按钮事件功能示例
Mar 25 jQuery
Angular2进阶之如何避免Dom误区
Apr 02 Javascript
微信小程序实现留言板
Oct 31 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
jQuery图片轮播功能实例代码
Jan 29 #Javascript
jQuery代码实现实时获取时间
Jan 29 #Javascript
用director.js实现前端路由使用实例
Jan 27 #Javascript
详解bootstrap的modal-remote两种加载方式【强化】
Jan 27 #Javascript
Jquery uploadify 多余的Get请求(404错误)的解决方法
Jan 26 #Javascript
js监听input输入框值的实时变化实例
Jan 26 #Javascript
jquery实现input框获取焦点的简单实例
Jan 26 #Javascript
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
php常量详细解析
2015/10/27 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
实例讲解python中的序列化知识点
2018/10/08 Python
django fernet fields字段加密实践详解
2019/08/12 Python
详解python路径拼接os.path.join()函数的用法
2019/10/09 Python
如何在python中实现随机选择
2019/11/02 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
SQL Server面试题
2013/04/04 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
最受欢迎的自我评价
2013/12/22 职场文书
小学班主任寄语大全
2014/04/04 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
中国梦团日活动总结
2014/07/07 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS