关于箭头函数

摘要:
1、 为什么constPerson={'name':function(){setInterval(function()){console.log('I'm‘+this.name+'I'm’+this.age+'这一年!constPerson={'name‘:'sayHello':

一、为什么存在

const Person = {
    'name': 'little bear',
    'age': 18,
    'sayHello': function () {
      setInterval(function () {
        console.log('我叫' + this.name + '我今年' + this.age + '岁!')
      }, 1000)
    }
  }
  Person.sayHello()

因为setInterval执行的时候,是在全局作用域下的,所有this指向的是全局window,而window上没有name和age,所以输出的是undefined。

通常的写法是缓存this,然后在setInterval中用缓存的this进行操作,如下:

 const Person = {
    'name': 'little bear',
    'age': 18,
    'sayHello': function () {
     let self = this
      setInterval(function () {
        console.log('我叫' + self.name + '我今年' + self.age + '岁!')
      }, 1000)
    }
  }
  const sayHelloFun = Person.sayHello
  sayHelloFun()

二、和普通函数的区别 

  从上面的例子中,我们已经可以看出箭头函数的优势。
  和普通函数相比,箭头函数主要就是以下两个方面的特点(不绑定this,arguments;更简化的代码语法)

  1、不绑定this

    什么叫不绑定this,我个人的理解为箭头函数的this其实就是在定义的时候就确定好的,以后不管怎么调用这个箭头函数,箭头函数的this始终为定义时的this 
我们还是以前面的那个setInterval代码为例:

const Person = {
    'name': 'little bear',
    'age': 18,
    'sayHello': function () {
      setInterval(function () {
        console.log('我叫' + this.name + '我今年' + this.age + '岁!')
      }, 1000)
    }
Person.sayHello()

    当Person.sayHello()去执行setInterval的时候,是在全局作用下执行的所有setInterval回调函数的this就为全局对象。es3-5中的函数this的值和调用这个函数的上下文有关。(注意是调用)
我们用箭头函数重写上诉函数:

const Person = {
    'name': 'little bear',
    'age': 18,
    'sayHello': () => {
      setInterval(() => {
        console.log('我叫' + this.name + '我今年' + this.age + '岁!')
      }, 1000)
    }
Person.sayHello()

    输出的还是undefined。为什么呢??
    因为我把方法写在了对象里,而对象的括号是不能封闭作用域的。所以此时的this还是指向全局对象。
    所以,通过以上的错误可以提醒我们,最好不要用箭头函数作为对象的方法。
    我们需要重新举一个例子,如下:

function Person () {
  this.name = 'little bear',
  this.age = 18
  let self = this
  setInterval(function sayHello () {
    console.log('我叫' + self.name + '我今年' + self.age + '岁!')
  }, 1000)
}
let p = new Person()

  2、不绑定arguments

    箭头函数还有一个比较有特点的地方就是其不绑定arguments,即如果你在箭头函数中使用arguments参数不能得到想要的内容。

let arrowfunc = () => console.log(arguments.length)
arrowfunc()
//output 
arguments is not defined

    所以在箭头函数中我们是不能直接使用arguments对象的,但是如果我们又想获得函数的参数怎么办呢?
我们可以使用剩余参数来取代arguments剩余参数详情

免责声明:文章转载自《关于箭头函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇公众号开发笔记二机器视觉与边缘计算:听课笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ahocorasick使用

一、作用  字符串匹配,比如现在有个大的列表,客户输入一句话,如何根据客户输入的一句话,从大列表中匹配出字符串交集  具体请详细查阅 二、示例  比如我们有一个wordlist列表,长度很长,包含43430个元素: ['长春海外制药接骨续筋片', '香菇炖甲鱼', '三鹤药业黄柏胶囊', '上海衡山熊去氧胆酸片', '升和药业依托泊苷注射液', '怡诺思'...

基于JWT的Token登录认证

1.JWT简介         JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。 2.JWT的原理        JWT的原理是,服务器认证以后,生成一个JSON格式的对象,发回给客户端,就像下面这样. { "用户名": "admin", "角色": "超级管理员", "到期时间": "2019-07-13...

python3去除行号

问题:在复制一些代码时会同时复制每行的行号,删除比较麻烦,所以利用python3本身的代码进行一键删除。 # 导入re 模块来使用正则表达式 import re """去掉行号""" print('remove application start') # 定义去除行号函数 def remove_line_num(instr): p = re.co...

Vue2.0进阶组件 短信倒计时组件

原本我想隔个几天再发文章,刚好今天项目上线,环境有问题,导致只有干等,刚好要为公司打造一套属于公司自己的一系列功能组件,这个使命就交给我了,大家也一直叫我来点干货,说实话我只是一个湿货,肚子里干一点就给你们出点货,那从今天开始不看岛国片系列教程视频,不但自撸,还教你撸............你懂的!!最强vue组件 写之前我只想说如果看到错别字,就别给我点...

Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

原文:http://czjxdm.iteye.com/blog/466948 Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法 博客分类:技术文章 OracleSQL  怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结。    什么是合并多...

JS控制div跳转到指定的位置的解决方案总结

总结一下自己在写这个需求遇到的问题,相信大家应该是经常遇到的。即要求滚轮滚动到指定的位置。先看下基本的解决方案。 1.给链接a加个#的方式来实现跳转。(锚点方法)这里直接贴下代码:    html页面: <div id="container"> <a href="http://t.zoukankan.com/jtjds-...