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 实现父窗口引用弹出窗口的值的脚本
Aug 07 Javascript
JavaScript 对象、函数和继承
Jul 07 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
jquery ajax 局部刷新小案例
Feb 08 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
Mar 05 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
Aug 18 Javascript
jquery插件推荐浏览器嗅探userAgent
Nov 09 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
Jan 19 Javascript
Vue常用的几个指令附完整案例
Nov 06 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP 类型转换函数intval
2009/06/20 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
Ruby如何定义一个类
2012/10/08 面试题
主题酒店策划书
2014/01/28 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
单位租房协议范本
2014/12/03 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
Python使用PyYAML库读写yaml文件的方法
2022/04/06 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android