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 19 Javascript
用JavaScript调用WebService的示例
Apr 07 Javascript
JavaScript浏览器选项卡效果
Aug 25 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
鼠标选择动态改变网页背景颜色的JS代码
Dec 10 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
JavaScript判断undefined类型的正确方法
Jun 30 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
Vue之Vue.set动态新增对象属性方法
Feb 23 Javascript
详解Vue组件之作用域插槽
Nov 22 Javascript
webpack file-loader和url-loader的区别
Jan 15 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
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python 多线程实例详解
2017/03/25 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
详解python中sort排序使用
2019/03/23 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
网吧消防安全制度
2014/01/28 职场文书
企业员工培训感言
2014/02/26 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
个人剖析材料范文
2014/09/30 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书