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

102 阅读2分钟

image.png

普通函数: function fn() { }
箭头函数: () => {}

image.png 如图:我们会使用new来创建构造函数的实例,但是箭头函数是不可以的,并且箭头函数是匿名的是函数表达式,因为不能用new关键字来调用箭头函数,那么不会自动生成prototype属性。

  • 箭头函数简写规则如下

    • 只有形参只有一个,可以不要小括号
    • 方法体内容,只有一行代码,可以不要大括号
    • 方法体内容,只有一行代码,可以不要return,代码执行结果决定return内容
  • 箭头函数不绑定this关键字,箭头函数中的this,指向箭头函数定义位置的上下文this不会通过call apply bind来改变this的指向,但是箭头函数依旧可以调用call apply bind方法,指向外层作用域,而普通函数谁调用这个函数那么this就指向谁。

let obj = {
  name:'光头强',
  age:18,
  sayFn(){
    console.log(this);
    let that = this
    setTimeout(function() {
      console.log(`${that.name}来了`);   
    },2000)
  }
}
obj.sayFn()
在普通函数中谁调用this就指向谁,如上代码setTimeout里的this指向window需要改变this指向,才能输出。

image.png

普通函数
<script>
function people () {
  return arguments.length
}
console.log("我有" +people(1,2,3) +"辆劳斯莱斯" );
//我有3辆劳斯莱斯

</script>
箭头函数
<script>
let people =  () =>  arguments.length

console.log("我有" +people(1,2,3) +"辆劳斯莱斯" );
//Uncaught ReferenceError: arguments is not defined at people

</script>

在函数内部有一个类似数组的对象arguments,普通函数需要复用因此有对象arguments可以实现更灵活的操作,但是箭头函数没有自己的对象arguments(匿名函数不用参数或者限定参数来执行),通过创建一个普通函数,普通函数返回一个箭头函数,箭头函数在返回arguments的长度,在通过变量接收来保存函数输入的参数,当执行

image.png worker函数表达式的时候相当于实现了people(1,2,3)(),people(1,2,3)()相当于先执行普通函数返回箭头函数,在执行箭头函数,由于作用域链的关系箭头函数保存了arguments的长度,就返回了结果(闭包作用),也能实现arguments的效果。如图:

image.png