箭头函数与普通函数的区别
一、声明方式不同
- 声明一个普通函数需要使用关键字
function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数 - 声明一个箭头函数则只需要使用箭头就可以,无需使用关键字
function,比普通函数声明更简洁。 - 箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名
对于普通函数来说,内部的
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
ES6 引入
rest 参数,用于获取函数不定数量的参数数组,这个API是用来替代arguments的,形式为...变量名,rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中rest参数与arguments的比较:
- 箭头函数和普通函数都可以使用
rest参数,而arguments只能普通函数使用 - 接受参数
rest比arguments更加灵活 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') // 报错
浙公网安备 33010602011771号