面试题答案
一键面试区别
- this 指向
- 普通函数:
this
指向取决于函数的调用方式。例如,在全局作用域调用,this
指向全局对象(浏览器中是window
);作为对象方法调用,this
指向该对象;通过call
、apply
、bind
调用,this
指向传入的第一个参数。 - 箭头函数:没有自己的
this
,它的this
继承自外层作用域,且无法通过call
、apply
、bind
改变this
指向。
- 普通函数:
- 性能
- 普通函数:在创建时,会生成一个
arguments
对象来存储传入的参数,这在某些情况下会占用额外的内存。 - 箭头函数:没有
arguments
对象,若要获取参数,可以使用剩余参数...args
。从这方面看,箭头函数在内存占用上可能稍优,特别是在不需要arguments
对象的场景下。另外,箭头函数由于没有自己的this
,不会创建额外的作用域来保存this
,在一定程度上也优化了内存使用。
- 普通函数:在创建时,会生成一个
- 构造函数
- 普通函数:可以作为构造函数使用,通过
new
关键字创建实例对象,其内部会自动创建一个新的对象,并将this
指向该新对象。 - 箭头函数:不能作为构造函数使用,使用
new
调用箭头函数会抛出错误。
- 普通函数:可以作为构造函数使用,通过
适用场景
- 普通函数
- 需要动态改变
this
指向的场景:例如在事件处理函数中,当需要根据不同情况改变函数内部this
指向时,普通函数更合适。比如在一个对象的方法中,需要根据不同条件调用该方法并改变this
指向不同的对象。 - 作为构造函数创建对象的场景:如果要创建自定义的对象类型,需要使用普通函数作为构造函数,来定义对象的属性和方法。
- 需要动态改变
- 箭头函数
- 简单的回调函数场景:当传递给其他函数的回调函数不需要自己的
this
且逻辑较为简单时,使用箭头函数可以使代码更简洁,例如在数组的map
、filter
、reduce
等方法的回调函数中。例如:const numbers = [1, 2, 3]; const squared = numbers.map(num => num * num);
- 希望
this
继承自外层作用域的场景:在一些嵌套函数中,若希望内部函数的this
与外层函数一致,箭头函数能很好地满足需求,避免了在普通函数中通过self = this
或使用bind
方法来绑定this
的繁琐操作。
- 简单的回调函数场景:当传递给其他函数的回调函数不需要自己的