箭头函数与普通函数的区别?


一、语法简洁,更加清晰

// 普通函数
const fn = function test(a,b) {
}

// 箭头函数
const fn = (a,b)=>{
}
// 若只有一个参数,小括号可省略
const fn = a =>{
 return a + 1
}
// 若执行语句只有一句return,中括号也可省略
const fn = a => return a + 1

二、不绑定this

箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值;
this代表函数调用相关联的对象,通常也称之为执行上下文。

let obj1 = {
  test: function() {
    console.log(this)
  }
}
obj1.test()  //{ test: func }

let obj2 = {
  test: () => {
    console.log(this)
  }
}

obj2.test()  //{}

提问:this的指向有哪几种情况?
1.作为函数直接调用,非严格模式下,this指向window,严格模式下,this指向undefined;
2.作为某对象的方法调用,this通常指向调用的对象。
3.普通函数使用apply、call、bind 可以绑定this的指向。
4.在构造函数中,this指向新创建的对象
5.箭头函数没有单独的this值,this在箭头函数创建时确定,它与声明所在的上下文相同。

三、this指向不变

箭头函数继承而来的this指向永远不变,call()、apply()、bind() 方法无法改变箭头函数中this的指向

  const fn = (a, b) => {
        console.log(this)
      }
   fn()   // window
   fn.call({ name: "lfy" }, 1, 2)   // 还是window

四、没有原型prototype

没有原型prototype, 指向 undefined

// 普通函数
 const fn1 = function () {}
    console.log(fn1.prototype)  // constructor

// 箭头函数
  const fn2 = a => {}
   console.log(fn2.prototype)  // undefined

五、不能作为构造函数使用

new关键词会进行如下的操作:
1.创建一个空对象;
2.链接该对象(设置该对象的__proto__)到构造器函数的原型 ,将新创建的对象作为this的上下文 ;
3.执行构造函数种的代码为新对象增加属性和方法;
4.返回新对象。若没有返回对象则返回this。
具体执行流程可以用代码体现出来:

function newFunc(father, ...rest) {
  // 首先创建一个空对象
  var result = {};
  // 将空对象的原型赋值为构造器函数的原型
  result.__proto__ = father.prototype;
  // 更改构造器函数内部this,将其指向新创建的空对象
  var result2 = father.apply(result, rest);
  if ((typeof result2 === 'object' || typeof result2 === 'function') && result2 !== null) {
    return result2;
  }
  return result;
}

箭头函数不能作为构造函数使用, 因为没有自己的 this,无法调用 call,apply, 也没有 prototype 属性 ,而 new 命令在执行时需要将构造函数的 prototype 赋值给新的对象的__prpto__

六、没有自己的arguments

   const fn = () => {
        console.log(arguments) //arguments is not defined
   }
   fn(1, 2, 3, 4)

箭头函数没有自己的arguments,在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。如果要用,可以用 rest 参数代替。

   const fn1 = (...rest) => {
      console.log(rest)  //[1,2,3,4] 
    }
    fn1(1, 2, 3, 4)

七、不能使用yield关键字

箭头函数不能作为生成器函数,也就是其内部不能使用yeild


总结

箭头函数和普通函数的区别基本就是这些了,希望可以帮助到你,关于yield关键字的用法以及生成器函数的概念的介绍,等我这两天整理一下再写一篇文章,感兴趣的朋友可以关注一下,我们共同学习,共同进步!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值