当前位置: 首页 > news >正文

【JavaScript】箭头函数和普通函数的区别

⚙️ ​​1. 语法与定义​

  • ​普通函数​​:
    使用 function 关键字声明,支持具名或匿名形式:

    function add(a, b) { return a + b; } // 具名
    const sum = function(a, b) { return a + b; }; // 匿名
    
  • ​箭头函数​​:
    使用 => 定义,​​均为匿名函数​​,单行时可省略 {}return

    const add = (a, b) => a + b; // 隐式返回
    const log = () => { console.log("Hi"); }; // 显式代码块
    

    ​特点​​:语法更简洁,适合回调函数和简单逻辑。


🧭 ​​2. this 绑定机制(核心区别)​

  • ​普通函数​​:
    this​动态绑定​​,取决于调用时的上下文:

    const obj = {name: "Alice",greet: function() { console.log(this.name); } // this 指向 obj
    };
    obj.greet(); // 输出 "Alice"
    

    若单独调用,this 可能指向全局对象(非严格模式)或 undefined(严格模式)。

  • ​箭头函数​​:
    this​词法绑定​​,继承定义时的外层作用域,​​不可被修改​​:

    const obj = {name: "Alice",greet: () => { console.log(this.name); } // this 指向 window
    };
    obj.greet(); // 输出 "undefined"(浏览器环境)
    

    嵌套场景下,箭头函数继承最近普通函数的 this

    const obj = {name: "Alice",inner: function() {const arrow = () => console.log(this.name); // this 继承 inner 的 this(指向 obj)arrow();}
    };
    obj.inner(); // 输出 "Alice"
    

    ​注意​​:call/apply/bind​无法改变​​箭头函数的 this


🔧 ​​3. 构造函数与原型​

  • ​普通函数​​:
    支持 new 实例化,拥有 prototype 属性,用于实现面向对象编程:

    function Person(name) { this.name = name; }
    const john = new Person("John"); // 正常创建实例
    
  • ​箭头函数​​:
    ​不能作为构造函数​​,无 prototype 属性,使用 new 会报错:

    const Person = (name) => { this.name = name; };
    const jane = new Person("Jane"); // 报错:Person is not a constructor
    

📦 ​​4. 参数对象 arguments

  • ​普通函数​​:
    内置 arguments 类数组对象,存储所有传入参数:

    function showArgs(a, b) { console.log(arguments); }
    showArgs(1, 2); // 输出 [1, 2]
    
  • ​箭头函数​​:
    ​无 arguments 对象​​,需用 ...rest 参数替代:

    const showArgs = (...args) => console.log(args);
    showArgs(1, 2); // 输出 [1, 2]
    

⚠️ ​​5. 其他区别​

​特性​​普通函数​​箭头函数​
​原型链​prototype 属性prototype
​生成器函数​支持 yieldfunction*不支持 yield
​严格模式下的 this可设为 undefined继承外层,不受严格模式影响
​方法定义​适合对象方法(需动态 this不适合(this 固定)

🎯 ​​6. 使用场景建议​

  • ​推荐箭头函数​​:

    • 回调函数(如 setTimeoutmap)避免 this 丢失:

      const obj = {data: [1, 2, 3],process: function() {this.data.forEach(item => console.log(item * 2)); // this 指向 obj}
      };
      
    • 需要固定 this 的场合(如闭包嵌套)。

  • ​推荐普通函数​​:

    • 构造函数(new 实例化)。
    • 对象方法(需动态 this)。
    • 需要 arguments 或生成器(function*)的场景。
http://www.lryc.cn/news/603019.html

相关文章:

  • 【AI论文】MegaScience:推动科学推理后训练数据集的前沿发展
  • Node.js + TypeScript 开发健壮的淘宝商品 API SDK
  • Flutter实现Android原生相机拍照
  • 项目任务如何分配?核心原则
  • MongoDB的内存和核心数对于运行效率的影响
  • Python动态规划:从基础到高阶优化的全面指南(2)
  • 商用车的自动驾驶应用场景主要包括七大领域
  • 代码随想录算法训练营第三十三天
  • C++模板进阶:从基础到实战的深度探索
  • 网易易盾、腾讯ACE等主流10款游戏反外挂系统对比
  • 7寸工业模组 XA070Y2-L01芯显科技详细参数资料
  • 图——邻接表基本操作算法实现
  • USRP X410 X440 5G及未来通信技术的非地面网络(NTN)
  • 代码解读:微调Qwen2.5-Omni 实战
  • 《Go Web编程实战派--从入门到精通》的随笔笔记
  • LLM Landscape:2025年大语言模型概览
  • 数据处理工具是做什么的?常见数据处理方法介绍
  • ethers.js基础(学习路线清单)
  • 正向代理和反向代理的理解
  • 从“PPT动画”到“丝滑如德芙”——uni-app x 动画性能的“终极奥义”
  • AI 驱动、设施扩展、验证器强化、上线 EVM 测试网,Injective 近期动态全更新!
  • clock_getres系统调用及示例
  • PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
  • 【代码解读】通义万相最新视频生成模型 Wan 2.2 实现解析
  • AR技术赋能工业设备维护:效率与智能的飞跃
  • 一个典型的微控制器MCU包含哪些模块?
  • 安宝特方案丨AI算法能力开放平台:适用于人工装配质检、点检、实操培训
  • Java学习-----如何创建线程
  • 基于黑马教程——微服务架构解析(二):雪崩防护+分布式事务
  • Qt:盒子模型的理解