首页 > 其他分享 >箭头函数与普通函数

箭头函数与普通函数

时间:2023-08-21 19:07:17浏览次数:30  
标签:函数 作用域 绑定 箭头 普通 构造函数

箭头函数与普通函数

箭头函数和普通函数在 JavaScript 中有一些区别,涉及到语法、作用域、this 绑定等方面。

1. 语法:

  • 箭头函数使用 => 符号来定义,通常可以更简洁地表示函数。
  • 普通函数使用 function 关键字来定义。

示例比较:

// 箭头函数
const arrowFunction = () => {
  // 函数体
};

// 普通函数
function regularFunction() {
  // 函数体
}

2. this 绑定:

  • 在箭头函数中,this 的值继承自外层的最近一层非箭头函数的作用域。这通常被称为“词法作用域”或“静态作用域”。箭头函数没有自己的 this,它会捕获外部函数的 this 值。
  • 在普通函数中,this 的值取决于函数的调用方式。在不同的情况下,this 可能指向不同的对象,如函数的调用者、调用上下文等。

示例比较:

const obj = {
  name: 'Example',
  arrowFunc: () => {
    console.log(this.name); // 输出 undefined,this 继承自外部作用域
  },
  regularFunc: function() {
    console.log(this.name); // 输出 'Example',this 取决于调用方式
  }
};

obj.arrowFunc();
obj.regularFunc();

3. 构造函数:

  • 普通函数可以用作构造函数,使用 new 关键字创建对象实例。
  • 箭头函数不能用作构造函数,不能通过 new 创建对象。

4. arguments 对象:

  • 普通函数内部可以使用 arguments 对象访问传递给函数的参数。
  • 箭头函数没有自己的 arguments 对象,它会继承外层作用域的 arguments 对象。

总结:

  • 箭头函数和普通函数都是用来创建函数的工具,但它们在语法、this 绑定、构造函数和arguments 对象方面有不同的行为。
  • 箭头函数在处理 this 时更为简洁,但在需要动态绑定 this 或使用 arguments 时,普通函数可能更适合。

使用场景及各自优势

箭头函数和普通函数在不同的使用场景中有各自的优势。下面我会分别介绍它们的使用场景和优势。

箭头函数的使用场景和优势:

  1. 简洁的语法: 箭头函数的语法更为简洁,适用于只有一个表达式的函数体。
  2. 词法作用域的 this 箭头函数的 this 绑定是词法作用域的,意味着它会继承外层的 this 值。这在许多情况下可以避免 this 指向的混淆问题。
  3. 回调函数: 当作为回调函数传递时,箭头函数的简洁性和 this 绑定可以避免不必要的 bind 操作,提高代码的可读性。
  4. 函数式编程: 在函数式编程中,箭头函数常用于处理数据流、映射、过滤等操作,因为它们更适合用于声明性的函数式风格代码。

普通函数的使用场景和优势:

  1. 动态的 this 普通函数的 this 绑定在运行时是动态确定的,这在需要根据调用者来确定 this 指向的情况下非常有用。
  2. 构造函数: 普通函数可以用作构造函数,通过 new 关键字创建对象实例。在创建自定义对象类型时,普通函数是必要的。
  3. 命名函数表达式: 普通函数可以被命名,使得调试和可读性更强。而箭头函数通常是匿名的。
  4. 闭包和作用域: 普通函数在闭包和作用域方面的行为更为灵活,适用于需要创建新的作用域、保存状态或实现私有属性的场景。
  5. 回调函数: 当需要动态确定 this 绑定或需要使用 arguments 对象时,普通函数更加合适。

综合考虑:

  • 在大多数情况下,如果你不需要动态的 this 绑定,并且函数体相对简单,可以考虑使用箭头函数以提升代码的可读性和简洁性。
  • 如果你需要动态的 this 绑定、需要创建构造函数、需要使用 arguments 对象,或者需要更多的灵活性和控制,普通函数可能更适合。


标签:函数,作用域,绑定,箭头,普通,构造函数
From: https://blog.51cto.com/u_14196886/7178175

相关文章

  • keytool : 无法将“keytool”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请
    如果在运行keytool命令时出现"keytool"项无法识别的错误,可能是因为你没有正确设置Java开发环境或未将keytool添加到系统路径中。你可以按照以下步骤解决此问题:一、确保已正确安装JDK(JavaDevelopmentKit)并配置了Java环境变量。你可以通过在命令提示符或终端中运行java......
  • 理解组合函数
    理解组合函数组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧、模式:口比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的;口那么如果每次我们都需要进行两个函数的调用,操作上就会显得重复;口那么是否可以将这两个函数组合......
  • #Powerbi 1分钟学会,RANK函数,多字段排名函数.
    一:思维导图&数据源示例1.1思维导图 1.2示例数据源二:参数构成三:案例度量值基础度量值总销量=CALCULATE(SUM('数据源'[销量]))总销售额=CALCULATE(SUM('数据源'[销售额]))RANK度量值RANK排名=RANK(  ---MAKEBYSIMONE  ---第一参数,skip/dense,可选......
  • vue——debounce防抖函数无效
    参考:vue记录-vue中使用lodash_.debounce防抖不生效原因,解决方案https://blog.csdn.net/Delete_89x/article/details/122000444 问题代码:<el-inputv-model="slotProps.form.condition"placeholder="请输入"@input="inputChange"></el-......
  • Vue的组件data为什么必须是一个函数?
    vue中的data必须是函数是为了保证组件的独立性和可复用性。实例是通过构造函数来创建的,每个构造函数可以new多个实例,每个实例都会继承原型上的方法和属性,在vue中,一个vue组件就是一个vue实例,当一个组件被复用多次,就会创建多个实例。如果data是对象,那么被多次复用的这个组件,在某......
  • JavaScript中的“函数式编程”
    前言我们虽然之前老是听说过“函数式编程”,但一直不能理解,我们静下心来研究了一下,才发现这些东西真的很巧妙。在React这些框架中,对象,函数为王,因为框架已经帮你打建好了在框架中,数据为王,那些函数本身就是用来处理数据这里我们要用更高层的思维,而放弃底层思维,这些本身都是用户数......
  • [转]Linux下,WinSCP普通用户登录sftp后切换到root权限 教程
    --------------------------------------------------------------------------------------------------------有这个需求的原因:为了提高系统安全性,禁用了root的ssh登录,但是又想使用sftp工具,如winscp,对root下的一些文件进行修改.下面这个方法注释掉了sudoers配置项Defa......
  • 8 JavaScript函数
    8JavaScript函数在JS中声明函数和python差不多.也要有一个关键字顶在前面.python是def,到了JS里换成了function,只不过在JS中没有像python那么死板,必须def后面必须跟上函数名.这也为我们未来做逆向提供了第一个超大的伏笔.//语法//声明函数function函数名(形参1,......
  • 2.1 入门实践-一张普通报表
    一、普通报表1.概述1.1报表设计流程图1.2报表设计案例目标这张报表由三部分构成:参数面板:通过下拉框控件选择地区,查询出对应地区的数据。表格:表格统计该地区下各销售员每个产品的销量。柱形图:柱形图将表格中的数据以图表的形式进行展示。2.制作步骤2.1新建......
  • 荒原之梦考研数学原创:函数本体偏离点必为尖点
    荒原之梦原创:函数本体偏离点必为尖点:https://zhaokaifeng.com/16812/补充说明:前面所说的内容总结起来就是:一个处处可导的本体函数只有一个可导趋势,凡是已经有无数个点满足这个可导趋势的趋势(与本体函数重合)就必须继续满足该可导趋势(继续重合),否则,开始偏离本体函数可导趋势的点一......