JavaScript箭头函数_动力节点Java学院整理


Posted in Javascript onJune 28, 2017

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头:

x => x * x

上面的箭头函数相当于:

function (x) {
 return x * x;
}

在继续学习箭头函数之前,请测试你的浏览器是否支持ES6的Arrow Function

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

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

如果参数不是一个,就需要用括号()括起来:

// 两个参数:
(x, y) => x * x + y * y

// 无参数:
() => 3.14

// 可变参数:
(x, y, ...rest) => {
 var i, sum = x + y;
 for (i=0; i<rest.length; i++) {
  sum += rest[i];
 }
 return sum;
}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

// SyntaxError:
x => { foo: x }

因为和函数体的{ ... }有语法冲突,所以要改为:

// ok:
x => ({ foo: x })

this

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

回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:

var obj = {
 birth: 1990,
 getAge: function () {
  var b = this.birth; // 1990
  var fn = function () {
   return new Date().getFullYear() - this.birth; // this指向window或undefined
  };
  return fn();
 }
};

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj

var obj = {
 birth: 1990,
 getAge: function () {
  var b = this.birth; // 1990
  var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
  return fn();
 }
};
obj.getAge(); // 25

如果使用箭头函数,以前的那种hack写法:

var that = this;

就不再需要了。

由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:

var obj = {
 birth: 1990,
 getAge: function (year) {
  var b = this.birth; // 1990
  var fn = (y) => y - this.birth; // this.birth仍是1990
  return fn.call({birth:2000}, year);
 }
};
obj.getAge(2015); // 25

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
面向对象的Javascript之三(封装和信息隐藏)
Jan 27 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
bootstrap中添加额外的图标实例代码
Feb 15 Javascript
vue使用axios实现文件上传进度的实时更新详解
Dec 20 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
Dec 25 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
浅谈vuex actions和mutation的异曲同工
Dec 13 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
原生JS中应该禁止出现的写法
May 05 Javascript
JavaScript之filter_动力节点Java学院整理
Jun 28 #Javascript
JavaScript高阶函数_动力节点Java学院整理
Jun 28 #Javascript
JavaScript之Date_动力节点Java学院整理
Jun 28 #Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 #Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 #jQuery
AngularJS实现单一页面内设置跳转路由的方法
Jun 28 #Javascript
JavaScript中常见的八个陷阱总结
Jun 28 #Javascript
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
python SSH模块登录,远程机执行shell命令实例解析
2018/01/12 Python
python实现雨滴下落到地面效果
2018/06/21 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
自我评价范文点评
2013/12/04 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
学习雷锋倡议书
2014/04/15 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang