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 option location 页面跳转实现代码
Dec 27 Javascript
11款基于Javascript的文件管理器
Oct 25 Javascript
关于JQuery($.load)事件的用法和分析
Apr 09 Javascript
js实现同一页面多个运动效果的方法
Apr 10 Javascript
js获取页面description的方法
May 21 Javascript
jquery实现简单的表单验证
Nov 17 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
巧用canvas
Jan 21 Javascript
JS实现div模块的截图并下载功能
Oct 17 Javascript
js实现转动骰子模型
Oct 24 Javascript
详解elementUI中input框无法输入的问题
Apr 27 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 Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
JS实现的省份级联实例代码
2013/06/24 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
使用pandas读取文件的实现
2019/07/31 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Django如何实现防止XSS攻击
2020/10/13 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
幼儿园门卫制度
2014/01/29 职场文书
小学运动会班级口号
2014/06/09 职场文书
婚前协议书范本
2014/10/27 职场文书
会计实训报告范文
2014/11/04 职场文书
怎样写离婚协议书
2015/01/26 职场文书
兵马俑的导游词
2015/02/02 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书