箭头函数与普通函数详解

106 阅读2分钟

外形

箭头函数使用=>定义,普通函数则无

// 普通函数
function func() {
  console.log('普通函数')
}

// 箭头函数
var a = () => {
  console.log('箭头函数')
}

箭头函数只能是匿名函数

普通函数可以是具名函数,也可以是匿名函数;箭头函数只能是匿名函数

// 普通函数的具名函数
function func() {
  console.log('普通具名函数')
}

// 普通函数的匿名函数
let a = function() {
  console.log('普通函数匿名函数')
} 

// 箭头函数只能是匿名函数
let b = () => {
  console.log('箭头函数只能是匿名函数')
}

箭头函数不能用作构造函数,不能使用new

普通函数可以用作构造函数,以此来创建实例对象

function Person(name,age){
   this.name=name;
   this.age=age;
}
let admin=new Person("恩诺小弦",18);
console.log(admin.name); // 恩诺小弦
console.log(admin.age);  // 18

Person用作构造函数,通过他能创建实例对象,但是构造函数不能用作构造函数

this

  • 普通函数的this通常指向调用它的对象,当普通函数用作构造函数时,this指向实例化对象。
  • 箭头函数本身是没有this的,但在声明的时候可以捕获所处的上下文的this供自己使用。 注:this一旦被捕获,就不会再发生改变

箭头函数例子

var webName="捕获成功";
let func=()=>{
  console.log(this.webName);
}
func();   // 捕获成功

解释:该箭头函数在全局作用域中声明,所以捕获全局的this,this指向的是window

var name = "恩诺1";
function wrap(){
  this.name="恩诺2";
  let func=() => {
    console.log(this.name);
  }
  func();
}
let en=new wrap();   // 恩诺2

解释:wrap作为构造函数,指向实例化对象(en),箭头函数func在普通函数wrap中声明,捕获的是内部this,所以打印的name指的是恩诺2

箭头函数不绑定arguments,取而代之用rest参数…解决

每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。但是箭头函数并没有此对象

function A(a){
  console.log(arguments);
}
A(1,2,3,4,5,8);  //  [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]


let B = (b)=>{
  console.log(arguments);
}
B(2,92,32,32);   // Uncaught ReferenceError: arguments is not defined


let C = (...c) => {
  console.log(c);
}
C(3,82,32,11323);  // [3, 82, 32, 11323]

其他区别

  • 箭头函数不能Generator函数,不能使用yeild关键字。
  • 箭头函数不具有prototype原型对象。
  • 箭头函数不具有super。
  • 箭头函数不具有new.target。

总结

  • 箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
  • 普通函数的this指向调用它的那个对象