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

箭头函数和普通函数的区别

箭头函数和普通函数(function 声明的函数)在 JavaScript 中有几个关键区别,这些区别会直接影响它们的使用场景:

1. 语法不同

普通函数用 function 关键字声明:

// 普通函数
function add(a, b) {return a + b;
}

箭头函数是 => 语法(像个箭头),更简洁:

// 箭头函数(简化版)
const add = (a, b) => a + b;

如果函数体有多行,需要用 {} 包裹并显式写 return

const add = (a, b) => {console.log("计算中...");return a + b;
};

2. this 指向不同(最核心区别)

这是两者最大的不同,直接影响函数的行为:

  • 普通函数this 指向调用它的对象(谁调用,this 就是谁),没有调用者时指向全局对象(浏览器中是 window,Node 中是 global)。

    const obj = {name: "张三",sayHi: function() {console.log(this.name); // this指向obj,输出"张三"}
    };
    obj.sayHi();
    
  • 箭头函数没有自己的 this,它的 this 是继承自外层作用域的 this(定义时就固定了,不会变)。

    const obj = {name: "张三",sayHi: () => {console.log(this.name); // this继承自外层(这里是window),输出undefined}
    };
    obj.sayHi();
    

3. 不能用作构造函数

  • 普通函数:可以用 new 关键字创建实例(构造函数)。

    function Person(name) {this.name = name;
    }
    const person = new Person("张三"); // 合法
    
  • 箭头函数:不能用 new 调用,会报错。

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

4. 没有 arguments 对象

  • 普通函数:内部有 arguments 对象,保存了传入的所有参数。

    function sum() {console.log(arguments); // 输出所有传入的参数,如[1,2,3]return Array.from(arguments).reduce((a,b) => a+b);
    }
    sum(1,2,3); // 6
    
  • 箭头函数:没有 arguments,但可以用剩余参数 ...args 代替。

    const sum = (...args) => {console.log(args); // 输出所有传入的参数,如[1,2,3]return args.reduce((a,b) => a+b);
    };
    sum(1,2,3); // 6
    

5. 没有 prototype 属性

箭头函数没有原型对象,而普通函数有:

function fn() {}
console.log(fn.prototype); // 有原型对象(Object)const fn = () => {};
console.log(fn.prototype); // undefined

总结:什么时候用哪种函数?

  • 箭头函数:适合简单逻辑、不需要自己的 this(比如回调函数、数组方法中的函数),语法更简洁。

    // 数组遍历(常用箭头函数)
    const arr = [1,2,3];
    arr.map(item => item * 2); // [2,4,6]
    

  • 普通函数:需要 this 指向调用者(比如对象方法、构造函数)、需要 arguments 或 prototype 时。

    // 对象方法(用普通函数,确保this指向对象)
    const calculator = {num: 10,add: function(n) {return this.num + n; // this指向calculator}
    };
    

记住:箭头函数的 this 是 “静态” 的(定义时确定),普通函数的 this 是 “动态” 的(调用时确定),这是最核心的区别。

http://www.xdnf.cn/news/18971.html

相关文章:

  • websocket的应用
  • 【物联网】什么是 DHT11(数字温湿度传感器)?
  • 为什么不能创建泛型数组?
  • 【计算机408计算机网络】第三章:自底向上五层模型之数据链路层
  • 轮廓周长,面积,外界圆,外界矩形近似轮廓和模板匹配和argparse模块实现代码参数的动态配置
  • STL 深度解析之vector【C++每日一学】
  • AI接管浏览器:Anthropic发布Claude for Chrome,是效率革命还是安全噩梦?
  • 科技大会用了煽情BGM
  • Linux网络基础1(一)之计算机网络背景
  • 解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决
  • 答案引擎优化(AEO)制胜策略:抢占AI Overviews流量红利
  • 【基于hyperledger fabric的教育证书管理系统】
  • Maven安装、IDEA集成Maven、依赖管理、单元测试
  • Pinterest自动化 “Pin“得高效
  • Oracle SQL 性能调优的基石:深入解读与驾驭执行计划
  • SpringMVC相关梳理
  • 使用 Wheel Variants 简化 CUDA 加速 Python 安装和打包工作流
  • PyTorch 机器学习基础(选择合适优化器)
  • MTK Linux DRM分析(二十四)- MTK mtk_drm_plane.c
  • 如何为在线医疗问诊小程序实现音视频通话功能?
  • uniapp跨平台开发---uni.request返回int数字过长精度丢失
  • OpsManage:基于Django的企业级AWS云资源运维管理平台
  • 绿幕电商直播为什么要用专业抠图软件.
  • React 状态丢失:组件 key 用错引发的渲染异常
  • 【Linux系统】线程控制
  • 安装Docker Desktop报错WSL needs updating
  • AAA服务器
  • VS2022+QT6.7+NetWork(TCP服务器多客户端助手)
  • 【若依】RuoYi-Vue-springboot3分离版
  • 专业的储存数据的结构:数据库