javascript函数如何定义_箭头函数和普通函数有何不同【教程】

7次阅读

箭头函数不能用作构造函数,无arguments、prototype和动态this绑定;其this词法继承且定义时确定,适合数组回调和保持外层this的异步场景,但不适用于对象方法、事件监听器或需arguments/new.target的场合。

javascript函数如何定义_箭头函数和普通函数有何不同【教程】

箭头函数不能用作构造函数,也没有 argumentsprototypethis 绑定——这不是“语法糖”,而是行为根本不同。

普通函数的 this 是动态绑定的

每次调用时,this 值取决于调用方式(谁调用、怎么调用):

  • 对象方法中:指向该对象(obj.fn()this === obj
  • 单独调用:this 指向全局对象(非严格模式)或 undefined(严格模式)
  • call/apply/bind 显式指定时:按传入值确定

这意味着你可以在运行时控制 this,比如事件回调里用 fn.bind(obj) 或保存 const self = this

箭头函数的 this 是词法继承的

它没有自己的 this,而是沿作用域链向上找外层普通函数或全局作用域this 值,且**定义时就确定,无法被改变**:

立即学习Java免费学习笔记(深入)”;

const obj = {   name: 'test',   regular() {     console.log(this.name); // 'test'     setTimeout(function() {       console.log(this.name); // undefined(非严格模式下是 window)     }, 100);     setTimeout(() => {       console.log(this.name); // 'test',继承自 regular()     }, 100);   } };

所以箭头函数不适合当对象方法、事件监听器(需访问触发元素时)、或需要被 new 调用的构造函数。

箭头函数没有 argumentscaller/callee

在普通函数内部,arguments 是类数组对象,记录传入参数;箭头函数里访问 arguments 会报 ReferenceError

  • 替代方案:用剩余参数 ...args
  • 如果需要模拟 arguments.callee(例如递归匿名函数),必须改用普通函数声明或命名函数表达式
  • new.target 在箭头函数中也无效,因此无法判断是否被 new 调用

这使得箭头函数无法用于需要反射式参数处理的场景,比如封装通用装饰器或兼容旧版 API 的适配层。

什么时候该用箭头函数?

核心判断标准:**是否需要独立的 thisarguments 或构造能力**。适合的场景包括:

  • 数组方法回调:[1,2,3].map(x => x * 2)
  • 异步回调中保持外层 thissetTimeout(() => this.doSomething(), 100)
  • 简化短小的单表达式逻辑(无副作用、不依赖运行时上下文)

但注意:过度嵌套箭头函数会让 this 链变得难追踪;若外层函数 this 本身是 undefined(如模块顶层箭头函数中),那内层箭头函数的 this 也是 undefined——这点常被忽略。

text=ZqhQzanResources