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

一、声明方式不同

  • 声明一个普通函数需要使用关键字function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数
  • 声明一个箭头函数则只需要使用箭头就可以,无需使用关键字function,比普通函数声明更简洁。
  • 箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名
二、this指向不同
对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。
它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。
箭头函数里面根本没有自己的this,而是引用的上层作用域中this
我们可以用call、apply、bind来改变普通函数的this指向,但是由于箭头函数的this指向在它定义时就已经确定了,永远指向它定义时的上层作用域中的this,所以使用这些方法永远也改变不了箭头函数this的指向。
三、箭头函数没有原型prototype,箭头函数不能当成一个构造函数
我们知道new内部实现其实是分为以下四步:
  • 新建一个空对象

  • 链接到原型

  • 绑定this,执行构造函数

  • 返回新对象

function myNew() {
// 1.新建一个空对象
let obj = {}
// 2.获得构造函数
let con = arguments.__proto__.constructor
// 3.链接原型
obj.__proto__ = con.prototype
// 4.绑定this,执行构造函数
let res = con.apply(obj, arguments)
// 5.返回新对象
return typeof res === 'object' ? res : obj
}
四、箭头函数没有自己的arguments,箭头函数处于全局作用域中,则没有arguments

普通函数能够打印出arguments,箭头函数使用arguments则会报错,因为箭头函数自身是没有arguments的,然后它会往上层作用域中去查找arguments,由于全局作用域中并没有定义arguments,所以会报错。

箭头函数处于普通函数的函数作用域中,arguments则是上层普通函数的arguments

可以使用rest参数代替
ES6 引入 rest 参数,用于获取函数不定数量的参数数组,这个API是用来替代arguments的,形式为...变量名,rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中

rest参数与arguments的比较:

  • 箭头函数和普通函数都可以使用rest参数,而arguments只能普通函数使用
  • 接受参数restarguments更加灵活
  • rest参数是一个真正的数组,而arguments是一个类数组对象,不能直接使用数组方法
五、箭头函数不能重复函数参数名称
function fn(name,name) {
console.log('fn2:',name)
}
let fn2 = (name,name) => {
console.log('fn',name)
}
fn('nan','jiu') // 'jiu'
fn2('nan','jiu') // 报错


posted @ 2022-09-29 23:20  努力的杨先生  阅读(1313)  评论(0)    收藏  举报