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 相关文章推荐
多广告投放代码 推荐
Nov 13 Javascript
js实现权限树的更新权限时的全选全消功能
Feb 17 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
Jul 31 Javascript
动态添加删除表格行的js实现代码
Feb 28 Javascript
7个JS基础知识总结
Mar 05 Javascript
Jquery插件分享之气泡形提示控件grumble.js
May 20 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
Mar 04 Javascript
vue2.0实战之基础入门(1)
Mar 27 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
Apr 13 Javascript
微信小程序动态的加载数据实例代码
Apr 14 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
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
CSS常用网站布局实例
2008/04/03 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序自定义底部弹出框
2020/11/16 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
Python 专题三 字符串的基础知识
2017/03/19 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Numpy 多维数据数组的实现
2020/06/18 Python
日期和时间问题
2015/01/04 面试题
学生个人的自我评价分享
2013/11/05 职场文书
小区门卫岗位职责
2013/12/31 职场文书
詹天佑教学反思
2014/04/30 职场文书
迎七一演讲稿
2014/09/12 职场文书
个人事迹材料范文
2014/12/29 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
加强党性修养心得体会
2016/01/21 职场文书
python实现高效的遗传算法
2021/04/07 Python
Python合并pdf文件的工具
2021/07/01 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle