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 相关文章推荐
JS修改css样式style浅谈
May 06 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
Aug 13 Javascript
用js闭包的方法实现多点标注冒泡示例
May 29 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
让checkbox不选中即将选中的checkbox不选中
Jul 11 Javascript
JQuery基础语法小结
Feb 27 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
es6中使用map简化复杂条件判断操作实例详解
Feb 19 Javascript
js实现数字跳动到指定数字
Aug 25 Javascript
vue路由的配置和页面切换详解
Sep 09 Javascript
字节飞书面试promise.all实现示例
Jun 16 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怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
seajs下require书写约定实例分析
2018/05/16 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
python中异常报错处理方法汇总
2016/11/20 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
销售自荐信
2013/10/22 职场文书
保研推荐信
2014/05/09 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
战友聚会策划方案
2014/06/13 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫