箭头函数是ES6引入的简写语法,与普通函数在this绑定、arguments对象、new调用、原型链以及语法结构上存在本质区别。箭头函数没有自己的this,它继承外层作用域的this值,且不能用作构造函数,也没有arguments对象,但可以使用剩余参数。普通函数则有独立的this,支持new调用,拥有arguments对象,并且可以作为构造函数使用。理解这些差异能帮助开发者避免常见错误,写出更清晰的代码。

箭头函数与普通函数除了上述核心区别外,在具体使用场景中还有更多细节差异。箭头函数不能使用new关键字实例化,因为箭头函数没有[[Construct]]内部方法,调用时若使用new会抛出TypeError。箭头函数也没有prototype属性,因此无法作为基类被继承。在this绑定上,箭头函数的this在定义时确定,而非调用时,这使得它特别适合用于回调函数或事件处理中,避免手动绑定this。普通函数的this则根据调用方式动态变化(如全局调用、方法调用、call/apply调用等)。此外,箭头函数不支持arguments对象,但可以通过剩余参数(...args)获取所有参数;普通函数则拥有类数组的arguments对象。在语法上,箭头函数如果只有一个参数可以省略括号,如果函数体只有一条返回语句可以省略大括号和return关键字,而普通函数必须使用function关键字。从性能角度,两者差异极小,但箭头函数在某些场景下可能因为缺少arguments和prototype而略微节省内存。在实际开发中,建议在需要动态this(如构造器、方法、事件绑定中需要访问当前对象)时使用普通函数,而在需要固定this(如回调、定时器、数组方法中)时使用箭头函数。
【常见问题】
问题1:箭头函数和普通函数在this指向上的根本区别是什么?
回答1:普通函数的this在调用时根据调用者动态确定,而箭头函数没有自己的this,它捕获定义时所在外层作用域的this值,并且this一旦绑定就不可改变,即使使用call、apply、bind也无法修改。
问题2:箭头函数能否作为构造函数使用?为什么?
回答2:箭头函数不能作为构造函数使用。因为箭头函数没有[[Construct]]内部方法,也没有prototype属性,所以使用new关键字调用箭头函数会抛出TypeError。
问题3:普通函数是否支持箭头函数中的剩余参数语法?
回答3:普通函数既支持arguments对象,也支持ES6的剩余参数语法(...args),但两者不能同时使用。箭头函数不支持arguments,只能使用剩余参数获取所有独立参数。
问题4:在事件监听中,使用箭头函数和普通函数有什么区别?
回答4:在事件监听中,普通函数作为回调时,this默认指向触发事件的DOM元素,而箭头函数的this会继承外层作用域,通常指向定义时的上下文(如window或类实例),因此需要根据需求选择:若需访问事件目标用普通函数,若需访问外层作用域用箭头函数。
问题5:箭头函数是否拥有原型链?
回答5:箭头函数没有prototype属性,因此它不能作为构造函数,也没有自己的原型对象。但箭头函数本身作为对象,其__proto__仍然指向Function.prototype,所以可以调用原型链上的方法。


