es6箭头函数要注意什么

注意事项:1、箭头函数会改变函数内this的指向与上级作用域中的this指向保持一致;2、不可以当作构造函数,即不可以使用new命令;3、不可以使用arguments对象;4、不可以使用yield命令,不能用作Generator函数。

es6箭头函数要注意什么

本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。

在 es6的 新语法中,出现了 箭头函数 。

ES6 允许使用“箭头”(=>)定义函数。

function fun(a){ return a; }// ↓ 去掉 function 在 ( ) 和 { } 之间添加 => var fun = (a) => { return a; }  // ↓ 如果只有一个形参可省略 ( ) 如果一个形参都没有,必须加( )         var fun = a => { return a; }  // ↓ 如果函数体只有一句话,可省略{ },如果仅有的这句话还是 return, 则必须省略 return         var fun = a => a

登录后复制

ES6中箭头函数注意事项

(1)箭头函数会改变函数内this的指向与上级作用域中的this指向保持一致

函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。

function foo() {  setTimeout(() => {    console.log('id:', this.id);  }, 100);}var id = 21;foo.call({ id: 42 });// id: 42

登录后复制

上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42。
箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域,而不是指向运行时所在的作用域。下面是另一个例子。

function Timer() {  this.s1 = 0;  this.s2 = 0;  // 箭头函数  setInterval(() => this.s1++, 1000);  // 普通函数  setInterval(function () {    this.s2++;  }, 1000);}var timer = new Timer();setTimeout(() => console.log('s1: ', timer.s1), 3100);setTimeout(() => console.log('s2: ', timer.s2), 3100);// s1: 3// s2: 0

登录后复制

上面代码中,Timer函数内部设置了两个定时器,分别使用了箭头函数和普通函数。前者的this绑定定义时所在的作用域(即Timer函数),后者的this指向运行时所在的作用域(即全局对象)。所以,3100 毫秒之后,timer.s1被更新了 3 次,而timer.s2一次都没更新。

箭头函数可以让this指向固定化,这种特性很有利于封装回调函数。下面是一个例子,DOM 事件的回调函数封装在一个对象里面。

var handler = {  id: '123456',  init: function() {    document.addEventListener('click',      event => this.doSomething(event.type), false);  },  doSomething: function(type) {    console.log('Handling ' + type  + ' for ' + this.id);  }};

登录后复制

上面代码的init方法中,使用了箭头函数,这导致这个箭头函数里面的this,总是指向handler对象。否则,回调函数运行时,this.doSomething这一行会报错,因为此时this指向document对象。

this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。

所以,箭头函数转成 ES5 的代码如下。

// ES6function foo() {  setTimeout(() => {    console.log('id:', this.id);  }, 100);}// ES5function foo() {  var _this = this;  setTimeout(function () {    console.log('id:', _this.id);  }, 100);}

登录后复制

上面代码中,转换后的 ES5 版本清楚地说明了,箭头函数里面根本没有自己的this,而是引用外层的this。

【相关推荐:javascript视频教程、web前端】

以上就是es6箭头函数要注意什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2935284.html

(0)
上一篇 2025年3月11日 20:50:22
下一篇 2025年3月6日 07:47:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • es6中什么是装饰器

    在es6中,装饰器(Decorator)是一种与类(class)相关的语法,用来注释或修改类和类方法;装饰器其实就是一个编译时执行的函数,语法“@函数名”,通常放在类和类方法的定义前面。装饰器有两种:类装饰器和类方法装饰器。 本教程操作环境…

    2025年3月11日
    200
  • assign是es6方法吗

    assign是es6方法。assign()是es6 Object对象新增的一个方法,“Object.assign()”方法用于对象的合并,可以将源对象的所有可枚举属性,复制到目标对象上;该方法的第一个参数是目标对象,后面的参数都是源对象。 …

    2025年3月11日
    200
  • es6怎么判断数组是否有某一项值

    判断方法:1、使用“arr.includes(元素值)”语句,如果返回值为true,则数组中有某一项;2、使用“arr.findIndex((v)=>{return v==元素值;})”语句,如果返回值不为“-1”,则数组中包含某一项…

    2025年3月11日
    200
  • es6怎么把字符串转化为对象

    转化方法:1、用“let 对象名 = {key1:”字符串1″,key2:”字符串2″,…}”语句,可将字符串转为对象的value;2、用“let 对象名={};对象名[&#822…

    2025年3月11日
    200
  • es6怎么判断对象key是否存在

    判断方法:1、用“Object.keys(obj)”语句返回一个包含obj对象所有key的数组;2、用“数组.includes(“key值”)”语句判断该key数组中是否存在指定值,如果返回值为true,则对象中存在…

    2025年3月11日
    200
  • es6新增的遍历方法有哪些

    新增的遍历方法有:1、findIndex(),可遍历数组,查找匹配的元素;2、find(),可遍历数组,查找第一个匹配的元素;3、entries(),对键值对进行遍历;4、keys(),对键名进行遍历;5、values(),对键值进行遍历。…

    2025年3月11日
    200
  • es6 math方法有哪些

    math方法有:1、指数方法,包含pow()、sqrt()等;2、对数方法,包含log()、log10()等;3、代数方法,包含abs()、sign()等;4、三角函数,包含sin()、cos()等;4、random(),返回伪随机数。 本…

    2025年3月11日
    200
  • es6中symbol到底是什么

    es6中的symbol是一种新的原始数据类型,用于表示独一无二的值,最大的用法是用来定义对象的唯一属性名;因为Symbol是原始数据类型,不是对象,所以Symbol函数栈不能用new命令。 本教程操作环境:windows10系统、ECMAS…

    2025年3月11日
    200
  • 什么是es6的解构

    在es6中,解构是按照一定模式从数组和对象中提取值,对变量进行赋值的过程;它是一种打破数据结果,将其拆分为更小部分的过程,可以达到简化提取信息的目的;比较常见的有对象解构、数组解构和混合解构。 本教程操作环境:windows10系统、ECM…

    2025年3月11日
    200
  • es6语法糖是什么意思

    es6语法糖是指编程语言中可以更容易的表达一个操作的语法;使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会,ES6新增的语法糖其实ES5也能实现,只是会稍微复杂一些。 本教程操作环境:windows10系统、ECMAScript …

    2025年3月11日
    200

发表回复

登录后才能评论