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 相关文章推荐
多个datatable共存造成多个表格的checkbox都被选中
Jul 11 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
Jul 14 Javascript
利用vue实现模态框组件
Dec 19 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
Feb 27 Javascript
DatePickerDialog 自定义样式及使用全解
Jul 09 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
JavaScript代码异常监控实现过程详解
Feb 17 Javascript
Vue基于localStorage存储信息代码实例
Nov 16 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
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
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php简单实现数组分页的方法
2016/04/30 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
生成二维码方法汇总
2014/12/26 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
通过实例了解js函数中参数的传递
2019/06/15 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
Python编码爬坑指南(必看)
2016/06/10 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python pandas用法最全整理
2019/08/04 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
管辖权异议上诉状
2015/05/23 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
六年级作文之预言作文
2019/10/25 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技