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高级程序设计
Dec 29 Javascript
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
Apr 12 Javascript
prototype Element学习笔记(篇一)
Oct 26 Javascript
Javascript 代码也可以变得优美的实现方法
Jun 22 Javascript
javascript 多级checkbox选择效果
Aug 20 Javascript
jquery实现背景墙聚光灯效果示例分享
Mar 02 Javascript
vue.js表格组件开发的实例详解
Oct 12 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
详解 vue better-scroll滚动插件排坑
Feb 08 Javascript
快速解决vue-cli在ie9+中无效的问题
Sep 04 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 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 数组的创建、调用和更新实现代码
2009/03/09 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
layUI的验证码功能及校验实例
2019/10/25 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
新春联欢会主持词
2014/03/24 职场文书
安全保证书范文
2014/04/29 职场文书
捐款感谢信
2015/01/20 职场文书
中考学习决心书
2015/02/04 职场文书
公司2015年终工作总结
2015/05/26 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android