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 相关文章推荐
Jquey拖拽控件Draggable使用方法(asp.net环境)
Sep 28 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
javascript获取下拉列表框当中的文本值示例代码
Jul 31 Javascript
全面解析Bootstrap中nav、collapse的使用方法
May 22 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
BootStrap table实现表格行拖拽效果
Dec 01 Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
Oct 30 Javascript
vue-router路由懒加载及实现的3种方式
Feb 28 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获取网站域名和地址的代码
2008/08/17 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php文件读取方法实例分析
2015/06/20 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
Python中实现switch功能实例解析
2018/01/11 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
《在家里》教后反思
2014/03/01 职场文书
元旦活动感言
2014/03/08 职场文书
社区服务活动总结
2014/05/07 职场文书
环保倡议书100字
2014/05/15 职场文书
会议简报格式范文
2015/07/20 职场文书
敬老院活动感想
2015/08/07 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书