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

34 阅读2分钟

箭头函数和普通函数是javascript中两种函数定义方式,它们在语法和功能上有一些区别。下面我将详细介绍箭头函数和普通函数的区别。

语法简洁性

箭头函数的语法相对于普通函数更加简洁。箭头函数可以使用箭头=>来定义,省略了function关键字和花括号,可以直接定义函数的参数和返回值。例如:

//普通函数
  function add(a: number, b: number) {
    return a + b;
  }

  //箭头函数
  const add2 = (a: number, b: number) => a + b;

箭头函数在只有一个参数的情况下,还可以省略括号。例如:

  //箭头函数
  const add2 = a => a *2;
this指向不同

在普通函数中,this的值是在函数被调用时确定的,它指向调用该函数的对象。而在箭头函数中,this的值是在函数定义时确定的,它指向定义箭头函数的上下文。这意味着箭头函数没有自己的this,它继承父级作用域的this。例如:

  //普通函数
  const obj = {
    name: "张三",
    sayName: function () {
      console.log(this.name);
    },
  };
  obj.sayName(); //张三

  //箭头函数
  const obj2 = {
    name: "李四",
    sayName: () => {
      console.log(this.name);
    },
  };
  obj2.sayName(); //undefined

在箭头函数中,this指向的是定义箭头函数的上下文,而不是调用箭头函数的对象。

不适用于构造函数

箭头函数不能作为构造函数,不能通过new关键字来实例化对象。而普通函数可以用作构造函数,可以通过new关键字来创建对象实例。例如:

  //普通函数
  function person() {
    this.name = "zhangsan";
  }
  const p = new person();
  console.log("p:", p); // p: person {name: 'zhangsan'}

  //箭头函数
  const person2 = () => {
    this.name = "zhangsan";
  };

  const p2 = new person2();
  console.log("p2:", p2); // p2: undefined  person2 is not a constructor
无arguments对象

在普通函数中,可以使用arguments对象来访问所有传入的参数,它是一个类数组对象。而箭头函数没有自己的arguments对象,它继承父级作用域中的arguments对象。例如:

  //普通函数
  function fn() {
    console.log(arguments[0]);
  }
  fn(1, 2, 3); //1

  //箭头函数
  const fn2 = () => {
    console.log(arguments[0]);
  };
  fn2(1, 2, 3); //undefined

总结来说,箭头函数和普通函数在语法上的区别主要体现在简洁性和this指向上。箭头函数的语法更加简洁,但不能作为构造函数,并且没有自己的this和arguments对象。普通函数的语法相对复杂一些,但可以用作构造函数,并且有自己的this和arguments对象。在实际使用中,我们可以根据具体的需求选择合适的函数定义方式。