一、声明方式不同
- 声明一个普通函数需要使用关键字
function
来完成,并且使用function
既可以声明成一个具名函数也可以声明成一个匿名函数 - 声明一个箭头函数则只需要使用箭头就可以,无需使用关键字
function
,比普通函数声明更简洁。 - 箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名
this
指向函数运行时所在的对象,但是这一点对箭头函数不成立。
它没有自己的this
对象,内部的this
就是定义时上层作用域中的this
。也就是说,箭头函数内部的this
指向是固定的,相比之下,普通函数的this
指向是可变的。
箭头函数里面根本没有自己的this
,而是引用的上层作用域中this
。
我们可以用call、apply、bind来改变普通函数的this指向,但是由于箭头函数的this指向在它定义时就已经确定了,永远指向它定义时的上层作用域中的this,所以使用这些方法永远也改变不了箭头函数this
的指向。
三、箭头函数没有原型prototype,箭头函数不能当成一个构造函数
我们知道new内部实现其实是分为以下四步:
-
新建一个空对象
-
链接到原型
-
绑定this,执行构造函数
-
返回新对象
普通函数能够打印出arguments
,箭头函数使用arguments
则会报错,因为箭头函数自身是没有arguments的,然后它会往上层作用域中去查找arguments
,由于全局作用域中并没有定义arguments
,所以会报错。
箭头函数处于普通函数的函数作用域中,arguments则是上层普通函数的arguments
可以使用rest参数代替 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') // 报错
标签:函数,区别,作用域,rest,箭头,arguments,name From: https://www.cnblogs.com/xl15/p/16743499.html