javascript 箭头函数的使用 初学者必看
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
本文我们介绍箭头(arrow)函数的优点。
更简洁的语法
我们先来按常规语法定义函数:
1
2
3
4
5
function funcName(params) {
return params + 2;
}
funcName(2);
// 4
该函数使用箭头函数可以使用仅仅一行代码搞定!
1
2
3
var funcName = (params) => params + 2
funcName(2);
// 4
是不是很酷!虽然是一个极端简洁的例子,但是很好的表述了箭头函数在写代码时的优势。我们来深入了解箭头函数的语法:
1
(parameters) => { statements }
如果没有参数,那么可以进一步简化:
1
() => { statements }
如果只有一个参数,可以省略括号:
1
parameters => { statements }
如果返回值仅仅只有一个表达式(expression), 还可以省略大括号:
1
2
3
4
5
6
parameters => expression
// 等价于:
function (parameters){
return expression;
}
现在你已经学会了箭头函数的语法,我们来实战一下。打开Chrome浏览器开发者控制台,输入:
1
var double = num => num * 2
我们将变量double绑定到一个箭头函数,该函数有一个参数num, 返回 num * 2。 调用该函数:
1
2
3
4
5
double(2);
// 4
double(3);
// 6
没有局部this的绑定
和一般的函数不同,箭头函数不会绑定this。 或则说箭头函数不会改变this本来的绑定。
我们用一个例子来说明:
1
2
3
4
function Counter() {
this.num = 0;
}
var a = new Counter();
因为使用了关键字new构造,Count()函数中的this绑定到一个新的对象,并且赋值给a。通过console.log打印a.num,会输出0。
1
2
console.log(a.num);
// 0
我们来看一下输出结果:如果我们想每过一秒将a.num的值加1,该如何实现呢?可以使用setInterval()函数。
1
2
3
4
5
6
7
function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
this.num++;
console.log(this.num);
}, 1000);
}
我们来看一下输出结果:
1
2
3
4
5
var b = new Counter();
// NaN
// NaN
// NaN
// ...
你会发现,每隔一秒都会有一个NaN打印出来,而不是累加的数字。到底哪里错了呢?
首先使用如下语句停止setInterval函数的连续执行:
1
clearInterval(b.timer);
我们来尝试理解为什么出错:根据上一篇博客讲解的规则,首先函数setInterval没有被某个声明的对象调用,也没有使用new关键字,再之没有使用bind, call和apply。setInterval只是一个普通的函数。实际上setInterval里面的this绑定到全局对象的。我们可以通过将this打印出来验证这一点:
1
2
3
4
5
6
7
function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
console.log(this);
}, 1000);
}
var b = new Counter();
你会发现,整个window对象被打印出来。 使用如下命令停止打印:
1
clearInterval(b.timer);
回到之前的函数,之所以打印NaN,是因为this.num绑定到window对象的num,而window.num未定义。
那么,我们如何解决这个问题呢?使用箭头函数!使用箭头函数就不会导致this被绑定到全局对象。
1
2
3
4
5
6
7
8
9
10
11
12
function Counter() {
this.num = 0;
this.timer = setInterval(() => {
this.num++;
console.log(this.num);
}, 1000);
}
var b = new Counter();
// 1
// 2
// 3
// ...
通过Counter构造函数绑定的this将会被保留。在setInterval函数中,this依然指向我们新创建的b对象。
为了验证刚刚的说法,我们可以将 Counter函数中的this绑定到that, 然后在setInterval中判断this和that是否相同。
1
2
3
4
5
6
7
8
9
10
function Counter() {
var that = this;
this.timer = setInterval(() => {
console.log(this === that);
}, 1000);
}
var b = new Counter();
// true
// true
// ...
总结正如我们期望的,打印值每次都是true。最后,结束刷屏的打印:
箭头函数写代码拥有更加简洁的语法;
不会绑定this。
————————————————
版权声明:本文为CSDN博主「茅坑的石头」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lishuoboy/article/details/87346141
javascript 箭头函数的使用 初学者必看的更多相关文章
- PHP常用180函数总结【初学者必看】
数学函数 1.abs(): 求绝对值 <span style="font-size: 14px;">$abs = abs(-4.2); //4.2<br>& ...
- 15个初学者必看的基础SQL查询语句
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...
- 轻松学习 JavaScript——第 6 部分:JavaScript 箭头函数
JavaScript箭头函数是ECMAScript 6中引入的编写函数表达式的一种简便方法.通常,在JavaScript中,可以通过两种方式创建函数: 函数语句. 函数表达式. 可以如下所示创建函数语 ...
- JavaScript箭头函数中的this详解
前言 箭头函数极大地简化了this的取值规则. 普通函数与箭头函数 普通函数指的是用function定义的函数: var hello = function () { console.log(" ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- 动态导航栏和JavaScript箭头函数
动态导航栏和JavaScript箭头函数 今天我们来写一下动态的导航栏,并且学一下JavaScript的箭头函数等相关问题. 样式如下所示: html中执行代码如下所示: <!DOCTYPE h ...
- java初学者必看之构造方法详细解读
java初学者必看之构造方法详细解读 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法. 格式 public 类名称(参数类型 参数名称){ 方法体 } 注 ...
- JavaScript初学者必看“箭头函数”
译者按: 箭头函数看上去只是语法的变动,其实也影响了this的作用域. 原文: JavaScript: Arrow Functions for Beginners 译者: Fundebug 为了保证可 ...
- JavaScript初学者必看“this”
译者按: JavaScript的this和Java等面向对象语言中的this大不一样,bind().call()和apply()函数更是将this的灵活度进一步延伸. 原文: JavaScript: ...
随机推荐
- git clone 使用用户名和密码
git clone http://邮箱(或用户名):密码@仓库 示例: 邮箱 xw@qq.com 密码: xw 仓库: http://git.test.com/abc/demo 注意: 邮箱中的 @ ...
- log4net示例2-日志输入存入Access(转)
需求:基于log4net组建,创建Console程序将日志输出到Access数据库. 具体实施: (1)创建控制台程序. (2)控制台程序中,添加一个纯文本文件,文件命名为“log-Access.se ...
- new (std::nothrow) 与 new
普通new一个异常的类型std::bad_alloc.这个是标准适应性态. 在早期C++的舞台上,这个性态和现在的非常不同:new将返回0来指出一个失败,和malloc()非常相似. 在内存不足时,n ...
- Nginx负载均衡-如何自定义URL中的hash key2
upstream backend1 { server 192.168.3.236:555; server 192.168.3.236:222; ...
- 使用第三方Java类库jaudiotagger完成Flac音频文件metadata(元数据)的读和修改
最近需要使用Java Swing做个读写Flac格式音频文件的小GUI工具,虽然Mp3tag完全可以完成Flac的读写(编辑)任务,但是为了简化工作流程(编辑Flac信息后调用其它系统的接口完成部分信 ...
- Rust零碎总结
1.Rust里没有null的概念,但是实际上有很多地方是需要null的概念的,这个时候就可以用Option来代替,它是泛型T的一个包装类,就是C#里的int?或Java里的Optional: [但反序 ...
- JSP的部分知识(一)
通过Servlet进行整个网站的开发是可以的. 不过在Servlet中输出html代码,特别是稍微复杂一点的html代码,就会给人一种很酸爽的感觉. 如果能够直接使用Html代码,然后在html中写j ...
- C++_对象数组与对象指针
对象数组与对象指针 1. 对象数组 所谓对象数组是指每一数组元素都是对象的数组, 也就是说,若一个类有若干个对象,则把这一系列的对象用一个数组来存放. 对象数组的元素是对象, 不仅具有数据成员,而且还 ...
- python 之 前端开发( DOM操作)
11.47 DOM操作 查找节点: 11.471 直接查找 document.getElementById //根据ID获取唯一一个标签 document.getElementsByClassName ...
- docker 实践九:docker swarm
介绍了 docker 三剑客中的 docker-machine 和 docker-compose 之后,就剩下一个 docker swarm 了.那本篇的主角就是它了. 注:环境为 CentOS7,d ...