浅析箭头函数与普通函数

604 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

浅析箭头函数与普通函数

什么是箭头函数? 先有个简单的印象。

fnName = (args) => {
  console.log(args);
}

那普通函数又是什么呢?

function fnName(args){
  console.log(args);
}

两者看起来似乎非常相似啊。那么区别在哪里呢?

箭头函数更简单

从写法上可以看出 相比起普通函数, 箭头函数用了三个符号就代替了function这个八个字母的关键字。

但如果仅仅就是这样的话,那就是多此一举了。

this的角度来说,箭头函数的this指向不会因为函数而改变,这一点,懂的都懂。

不懂的,可以看完下面这段解析。

普通函数的this指向会因为运行时的执行上下文而改变,这使得曾经有非常多的文章去谈function的this的指向问题。也是在开发中的一大痛点。

而箭头函数只取决于定义时的上下文。可以简单理解为,你在敲代码时你看见的上下文就是箭头函数的上下文。

箭头函数与普通函数的对比

区别

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

  2. 箭头函数没有arguments,如果要用,可以用 rest 参数代替 (注意在node环境下是有arguments的)

  3. 箭头函数不能作为构造函数,不能使用new

  4. 箭头函数没有原型,不能继承

  5. 箭头函数不能当做Generator函数,不能使用yield关键字

  const fn1 = (...numbers) => {
    console.log(this)  // window
    console.log(numbers) // [123]
    console.log(arguments) // error
  };
  const fn2 = function () {
    console.log(this) // window
    console.log(arguments) // [123]
  }

  fn1(123);
  fn2(123);