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

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

时间:2024-03-31 12:34:18浏览次数:23  
标签:const 函数 区别 作用域 箭头 普通 console

概述

我们在学习js的时候经常会跟函数打交道,其中普通函数和箭头函数是用的比较多的2种,很多同学并不清楚二者的区别,这里我们花一些时间讨论一下。

作用域

在讨论箭头函数与普通函数的区别之前,我们需要先讨论一下作用域的概念。作用域分为:全局作用域,局部作用域,块级作用域

  • 全局作用域
    •   全局作用域是在整个代码中都可访问的作用域。
  • 局部作用域
    •   局部作用域一般代指函数作用域(Function Scope),它是在函数内部声明的作用域,函数内部的变量和函数只能在函数内部访问,外部无法直接访问
  • 块级作用域
    •   块级作用域是在代码块(通常是由大括号{}包裹起来的部分)内声明的作用域。比如if(){...}、for(...){...}、try{...}等
  • 示例
    <script type="text/javascript">
            // 全局作用域
            const global_a="我是全局作用域";
            const b=function()
            {
                const local_b="我是局部作用域";
                try{
                    const block_c="我是块级作用域";
                    console.log(block_c);
                }
                catch(ex)
                {
    
                }
                console.log(global_a);
                console.log(local_b);
            }
            b();
        </script>

     

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

 

  1. 语法的不同

    • 箭头函数语法:箭头函数由 小括号()、箭头=》、大括号{}组成,例如(x)=>{ return 2*x;},  (x)=> 2*x...  ,其中括号和大括号依情况可以省略
    • 普通函数语法:普通函数由关键字function、小括号、大括号{}组成,例如:function(x)=>{return 2*x;}
  2. this绑定的不同

    • 箭头函数没有自己的this绑定,它会继承外层作用域的this值(继承规则:向外层作用域中, 一层层查找this, 直到有this的定义)。而普通函数的this值是根据调用时的上下文决定的。这里给出一些示例
      • <div>
                <button id="bt1">利用箭头函数构造事件处理函数</button>
                <button id="bt2">利用普通函数构造事件处理函数</button>
            </div>
            <!-- 箭头函数没有自己的this绑定,它会继承外层作用域的this值。而普通函数的this值是根据调用时的上下文决定的 -->
            <script type="text/javascript">
                const bt1 = document.querySelector("#bt1");
                const bt2 = document.querySelector("#bt2");
                // 这里有两个点击事件,一个绑定的事件处理函数为普通函数,一个为箭头函数
         
                bt2.addEventListener("click", function() {
                    //这里的this是id="bt2",this指向调用这个函数的对像
                    console.log(this);
                });
         
                bt1.addEventListener("click", () => {
                    //这里的this是window,箭头函数的this指向最近的外层作用域中的this所指对象
                    console.log(this);
                });
            </script>
        <div>
                <button id="bt1">利用箭头函数构造事件处理函数</button>
                <button id="bt2">利用普通函数构造事件处理函数</button>
            </div>
            <!-- 箭头函数没有自己的this绑定,它会继承外层作用域的this值。而普通函数的this值是根据调用时的上下文决定的 -->
            <script type="text/javascript">
                const obj = {
                    a() {
                        setTimeout(function() {
                            //因为是window对象调用了定时函数,所以这里的this是window
                            console.log(this);
                        })
                    },
                    b() {
                        setTimeout(() => {
                            //因为箭头函数里的this指向了最近的外层函数作用域中,所以这里的this是obj对象
                            console.log(this);
                        })
                    }
                }
                obj.a(); // 打印出 Window
                obj.b(); // 打印出 当前对象obj
        
            </script>

         

  3. 构造函数:箭头函数不能用作构造函数,不能使用new关键字实例化对象。普通函数可以被用作构造函数创建对象实例

  4. arguments对象:箭头函数没有自己的arguments对象,它会继承外层作用域的arguments对象。普通函数则会创建自己的arguments对象

  5. 箭头函数没有原型属性(prototype)

  6. 箭头函数不能通过call()、apply()或bind()方法来改变this的指向

总结

普通函数比较灵活,适用于各种场景,包括作为构造函数、改变this指向等。而箭头函数更适合用于简单的函数表达式和回调函数,需要根据具体的使用场景和需求来选择使用箭头函数还是普通函数。

 

标签:const,函数,区别,作用域,箭头,普通,console
From: https://www.cnblogs.com/smallstone/p/18106142

相关文章

  • proc_create_data函数创建/proc/目录下的文件
    proc_create_data是Linux内核中用于创建/proc虚拟文件系统中的一个文件接口函数。这个函数允许内核模块或驱动程序在/proc目录下创建一个文件节点,用户空间的程序可以通过读写这个文件来与内核模块进行交互,获取或设置相关信息。函数原型通常如下所示:structproc_dir_entry*......
  • Z函数
    s=input()n=len(s)z=[0]*nleft,right=0,0#z[i]表示s和s[i:]的LCP长度,规定z[0]=0!foriinrange(1,n):#如果在z-box里,那么更新它的z[i]的值!ifi<=right:z[i]=min(z[i-left],right-i+1)#相当于暴力更新whilei+z[i]......
  • Web墨卡托投影介绍,Web墨卡托投影和普通墨卡托投影有什么区别?EPSG:3857坐标系和EPSG:43
    Web墨卡托投影和普通墨卡托投影在本质上是相同的,但它们在坐标范围使用单位和应用领域上存在一些区别:坐标范围:普通墨卡托投影的坐标范围通常在整个地球表面上,由于使用浮点数表示,所以不限制其范围。Web墨卡托投影的坐标范围通常被限制在一个固定的范围内,以适应Web地图的显......
  • neo4j使用详解(六、cypher常用函数语法——最全参考)
    Neo4j系列导航:neo4j及简单实践cypher语法基础cypher插入语法cypher插入语法cypher查询语法cypher通用语法cypher函数语法4.常用函数主要包括谓词函数(断言函数)、标量函数、聚合函数、字符串函数以及集合函数4.1.谓词函数(断言函数)谓词函数返回true或者false,主要......
  • 你真的了解回调函数吗?(文章最后放置源码)
    一、什么是回调函数简单来说就是通过函数指针调用的函数。复杂一些呢就是说将函数的指针(地址)作为参数传递给另外一个函数使用,当这个指针被用来调用其指向的函数的时候被调用的函数就是回调函数。二、回调函数怎么使用1、在学习回调函数之前我们是如何进行运算的我们来看下......
  • CTF中各类加密密文区别
    收集CTF-MISC中常见的密码种类base16字典中包含0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、Fbase32打印字符大写字母(A-Z)和数字234567base36使用0–9和拉丁字母A–Z表示数字。base58数字、大写字母、小写字母,去除歧义字符0(零)、O(大写字母O)、I(大写字母i)、l......
  • memcmp 函数的使用
    memcmp函数的使用memcmp函数的定义intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节返回值如下:memcmp函数的使用#include<stdio.h>#include<string.h>intmain(){ charbu......
  • 用函数指针数组来实现对一系列函数的调用
    include<stdio.h>intadd(inta,intb);intsub(inta,intb);intmax(inta,intb);intmin(inta,intb);voidmain(){inta,b,i,k;int(*func[4])(int,int)={add,sub,max,min}//定义指针数组,并对其赋初始值printf("selectoperator(0-add,1-sub,2-max,3-min)......
  • 函数模板类型推断
    先看一段代码:template<typenameT>voidmyfunc(T&tmprv){cout<<"--------------------begin--------------------"<<endl;usingboost::typeindex::type_id_with_cvr;cout<<"T="type_id_with_cvr<T&......
  • 高等数学基础篇之判断一元函数是否连续、可导、可微,极限、原函数是否存在
    一元函数:一、极限存在的条件二、连续的条件三、可导的条件四、可微的条件五、原函数存在的条件目录一、极限存在的条件1.自变量趋于无穷大时函数的极限2.自变量趋于有限值时函数的极限二、连续的条件1.自变量改变量趋于0时,函数值改变量也趋于02.该点的极限等于该......