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

75 阅读1分钟

箭头函数用=>的写法,更加简洁

箭头函数创建时不会创建自己的this,只会从自己的作用链上继承上级的this

定义是获取所处外层执行环境的this,并且不会变

举个🌰

var id = 'window'
function fn1 () {
    setTimeout(function () {
        console.log(this.id)
    })
}
function fn2 () {
    setTimeout(() => {
        console.log(this.id)
    })
}
fn1.call({id: 'obj'}) // 'window'
fn2.call({id: 'obj'}) // 'obj'

这段代码就很神奇,外层定义一个id,fn1,fn2里面都是定时器,一个普通函数,一个箭头函数,调用时都应用call改变了this。 fn1的普通函数,在定时器执行时已经是在window环境,所以是window。 fn2的箭头函数,因为是定义时就锁定了外层的this,所以在fn2调用时用call改变了this,打印了obj

另一个🌰

var obj = {
  id: 'OBJ',
  a: function(){
    console.log(this.id);
  },
  b: () => {
    console.log(this.id);
  }
};

obj.a();    // 'OBJ'
obj.b();    // 'GLOBAL'

obj.a()执行时,a的普通函数中的this是在obj中的this,即为obj对象中的id obj.b()执行时,b的箭头函数中的this是在window中的this,即使是通过obj.调用的也是window

call/apple/bind 都无法改变箭头函数中的this指向

箭头函数不能作为构造函数使用

箭头函数没有prototype

箭头函数不能用作Genertor函数,不能使用yeild关键字