本文我们介绍箭头(arrow)函数的优点。

更简洁的语法

我们先来按常规语法定义函数:

function funcName(params) {

return params + 2;

}

funcName(2);// 4

该函数使用箭头函数可以使用仅仅一行代码搞定!

var funcName = (params) => params + 2;

funcName(2);// 4

是不是很酷!虽然是一个极端简洁的例子,但是很好的表述了箭头函数在写代码时的优势。我们来深入了解箭头函数的语法:

(parameters) => { statements }

如果没有参数,那么可以进一步简化:

() => { statements }

如果只有一个参数,可以省略括号:

parameters => { statements }

如果返回值仅仅只有一个表达式(expression), 还可以省略大括号:

parameters => expression

// 等价于:

function (parameters){

return expression;

}

现在你已经学会了箭头函数的语法,我们来实战一下。打开Chrome浏览器开发者控制台,输入:

var double = num => num * 2

我们将变量double绑定到一个箭头函数,该函数有一个参数num, 返回 num * 2。 调用该函数:

double(2);// 4

double(3);// 6

没有局部this的绑定和一般的函数不同,箭头函数不会绑定this。 或者说箭头函数不会改变this本来的绑定。

我们用一个例子来说明:

function Counter() {

this.num = 0;

}

var a = new Counter();

因为使用了关键字new构造,Count()函数中的this绑定到一个新的对象,并且赋值给a。通过console.log打印a.num,会输出0。

console.log(a.num);// 0

如果我们想每过一秒将a.num的值加1,该如何实现呢?可以使用setInterval()函数。

function Counter() {

this.num = 0;

this.timer = setInterval(function add() {

this.num++;

console.log(this.num);

}, 1000);

}

我们来看一下输出结果:

var b = new Counter();// NaN// NaN// NaN...

你会发现,每隔一秒都会有一个NaN打印出来,而不是累加的数字。到底哪里错了呢?首先使用如下语句停止setInterval函数的连续执行:

clearInterval(b.timer);

我们来尝试理解为什么出错:首先函数setInterval没有被某个声明的对象调用,也没有使用new关键字,再之没有使用bind, call和apply。setInterval只是一个普通的函数。实际上setInterval里面的this绑定到全局对象的。我们可以通过将this打印出来验证这一点:

function Counter() {

this.num = 0;

this.timer = setInterval(function add() {

console.log(this);

}, 1000);}

var b = new Counter();

你会发现,整个window对象被打印出来。 使用如下命令停止打印:

clearInterval(b.timer);

回到之前的函数,之所以打印NaN,是因为this.num绑定到window对象的num,而window.num未定义。

那么,我们如何解决这个问题呢?使用箭头函数!使用箭头函数就不会导致this被绑定到全局对象。

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是否相同。

function Counter() {

var that = this;

this.timer = setInterval(() => {

console.log(this === that);

}, 1000);}

var b = new Counter();// true// true// ...

正如我们期望的,打印值每次都是true。最后,结束刷屏的打印:

clearInterval(b.timer);

总结

箭头函数写代码拥有更加简洁的语法;

不会绑定this。

作者:Fundebug

来源:https://blog.fundebug.com/2017/05/24/arrow-function-for-beginner/

JS箭头函数的优势在哪里相关推荐

  1. js箭头函数和普通函数区别

    js箭头函数和普通函数区别 实验环境:nodejs v12.16.1 箭头函数不能作为构造函数,而普通函数可以 箭头函数没有原型,而普通函数有 箭头函数return可以省略语句块.(如果=>右边 ...

  2. JS 箭头函数与普通函数

    JS 箭头函数与普通函数 一. 写法 // 1 普通函数 function (item) {return item + 1 }// 2 箭头函数 (item) => {return item + ...

  3. js 箭头函数的this详解

    箭头函数的this,让很多人困惑,并且,看了一些文章,也没有说得很清楚.既然是programmer,那就让代码说话 function test1(){const user = {first: 'Bob ...

  4. JS箭头函数用户和箭头函数转成普通函数处理方法

    1 箭头函数 箭头函数是ES6出现的新的函数形式 即,使用ES6箭头函数语法定义函数,将原函数的"function"关键字和函数名都删掉,并使用"=>"连 ...

  5. js 箭头函数没有 constructor,不能被new

    var fn1 = function(item) {console.log('item---', item) } var fn = (item) => {console.log('item--- ...

  6. Js 箭头函数 详细介绍(多种使用场景差异,你学会了吗?)

    简要认识 箭头函数是在ES6中添加的一种规范,简化了匿名函数定义的写法. 基本格式 完整写法 let fn = (x,y) => {return x + y; }//function()写法 l ...

  7. js 箭头函数和普通函数的区别

    ECMAScript6 中新增了箭头函数.任何使用表达式的地方,都可以使用箭头函数. 箭头函数的注意事项: 如果箭头函数只有一个参数,可以不用加括号 箭头函数可以没有{},但是只能写一行代码,是一个值 ...

  8. js箭头函数/函数this指向

    一.函数的this指向 this是每一个函数都 一定有的关键词 this本质上是一个对象数据结构 用于指向数据 通过this关键词,可以调用操作这个 数据 1.this指向window    声明式函 ...

  9. ajax箭头函数,JS箭头函数

    一.定义 const aa = (参数列表) => {}x => x * x 相当于function (x) { return x * x; } 二.参数问题和返回值 当只有一个参数时,参 ...

最新文章

  1. kind富文本编辑器_富文本编辑器原理探索
  2. 2002无法连接mysql阿里云_2002无法登录MySQL服务器
  3. 7-26复习重载并实现重载部分符号
  4. 得到classpath和当前类的绝对路径的一些方法
  5. php 修改服务器ip,php 修改服务器ip
  6. DOM-基本概念及使用
  7. 全国市级城市拼音-中文对照表(json格式)
  8. MultiDesk远程桌面连接
  9. Carte+kettle+mysql性能问题定位分析记录
  10. win7浏览器主页修改不过来_win7系统浏览器主页修改不了的解决方法
  11. re正则匹配中文字符
  12. php版工行聚合支付和e支付
  13. 开发人员与测试人员关系的理解
  14. html常用标签梳理
  15. 数据结构课程设计大作业——江大公交路线查询系统
  16. 如何注册全部DLL文件以及DLL简要说明
  17. php记事,PHP记事(2)
  18. 中小互联网软件公司的骗局--前言
  19. server2008服务器可以远程桌面连接,但是ping不通
  20. 4、配置虚拟局域网技术

热门文章

  1. 用几个最简单的例子带你入门 Python 爬虫
  2. 1200 美元创业成硅谷首富,甲骨文创始人埃里森传
  3. “不会MySQL,干啥都不行!”高级开发:工作、面试处处都会踩坑!
  4. 挽救数据库性能的 30 条黄金法则 | 原力计划
  5. 开发者该如何利用 C# 加解密?
  6. Linux 给我的七个宝贵教训
  7. 豪!华为放话:3年培养100万AI人才!网友神回应了
  8. 一文详解 Try 和异常的区别
  9. CSRankings 学术机构排行榜:“三巨头”不可撼动,清华大学突围 AI 榜单!
  10. 微信停机断网可充话费;苹果正研发可折叠屏幕 iPad;Rust 1.36.0 发布 | 极客头条...