面试题答案
一键面试JavaScript 函数表达式更合适的场景及原因
- 需要自己的
this
绑定- 场景:在事件处理程序、构造函数等场景中,需要函数内部的
this
指向特定对象。例如在 DOM 事件绑定中,传统函数表达式能使this
指向触发事件的 DOM 元素。 - 原因:函数表达式有自己独立的
this
绑定,其this
值取决于函数的调用方式。而箭头函数没有自己的this
,它的this
继承自外层作用域,这在某些需要函数自身特定this
指向的场景下会导致问题。
- 场景:在事件处理程序、构造函数等场景中,需要函数内部的
- 需要使用
arguments
对象- 场景:当函数需要处理不定数量的参数时,可能会用到
arguments
对象。例如实现一个简单的函数来计算传入参数的总和。 - 原因:函数表达式内部可以访问
arguments
对象,它包含了函数调用时传入的所有参数。箭头函数没有自己的arguments
对象,若在箭头函数中使用arguments
,它会从外层作用域继承,这可能导致意外结果。
- 场景:当函数需要处理不定数量的参数时,可能会用到
- 作为构造函数
- 场景:当需要创建对象实例,通过构造函数模式来构建对象。
- 原因:函数表达式可以作为构造函数使用,通过
new
关键字调用,会创建一个新的对象实例,并将函数内部的this
指向这个新实例。箭头函数不能用作构造函数,使用new
调用箭头函数会抛出错误。
箭头函数更具优势的场景及原因
- 简洁的语法
- 场景:在传递简单的回调函数时,例如在数组的
map
、filter
、reduce
等方法中。如使用map
方法将数组中的每个元素翻倍。 - 原因:箭头函数语法更为简洁,代码量更少,提高了代码的可读性和编写效率。相比传统函数表达式,省略了
function
关键字、花括号(对于简单的单行表达式)和return
关键字(对于简单的单行表达式且返回值直接跟在箭头后)。
- 场景:在传递简单的回调函数时,例如在数组的
- 词法作用域的
this
- 场景:在嵌套函数中,需要保持与外层作用域相同的
this
指向。例如在一个对象的方法内部定义一个内部函数,该内部函数需要访问外部对象的属性。 - 原因:箭头函数的
this
继承自外层作用域,不会被函数调用方式改变。这使得在复杂的嵌套函数场景中,更容易预测和控制this
的指向,避免因this
绑定问题导致的错误。
- 场景:在嵌套函数中,需要保持与外层作用域相同的
- 没有原型
- 场景:如果不需要使用函数的
prototype
属性,例如一些简单的辅助函数,只作为一次性的代码片段使用。 - 原因:箭头函数没有
prototype
属性,相比函数表达式,在内存占用上会稍小一些,因为不需要为prototype
分配额外的内存空间。
- 场景:如果不需要使用函数的