• Js学习小结(二)函数


    (一)声明函数

    1. 直接量(字面量)声明
        function f1(){
            ...
        }
    
    1. 表达示声明
        var f2 = function(){
            ...
        }
    
    1. 内置构造函数声明(使用此方式情况很少,一般不用,所以就不过多赘述)
        var f3 = new function();
    

    (二)调用函数

    1. 直接量声明函数调用
        f1();
        function f1(){
            console.log(111);
        }
        f1();
    

    结果:

    111
    111
    

    声明前后都可调用
    2. 表达示声明函数调用

        f2();
        var f2 = function(){
            console.log(222);
        }
        f2();
    

    结果:

        异常:f2不是一个方法(原因:js的变量和函数提升)
        222
    

    只能先声明后调用

    (三)函数的形参和实参

    以后更新

    (四)回调函数

    1. 在JS中函数自身的作用域在声明的地方,而不是在调用的地方

    2. 在Js中函数是被称为第一等公民,因为函数是js的一个特殊的数据类型,
    JS是以值的形式来处理函数的,那么就促成JS的回调函数。

        //1.声明赋值变量a
        var a = 1;
        function f1(f){
            //3.进入f1()方法
            console.log(f);
            //4.声明赋值变量a
            var a = 2;
            //5.执行f()方法,也就是f2()【可以理解为指针或引用】,并寻找f2()声明处并执行
            f();
        }
        function f2(){
            //6.执行f2(),寻找变量a(先找到全局变量a,所以没有找到局部变量a,至于它为什么没有套娃执行和找不到局部a,这是js的运行原理,也就是js作用域链)
            console.log(a);
        }
        //2.将函数名f2传入函数f1内
        f1(f2);
    

    结果:

    [Function: f2]
    1
    

    (五)函数闭包

    闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。

    闭包的作用:

    1.保留作用域

    2.函数内外的桥梁

        //0.声明赋值全局a
        var a = 2;
        //0.声明方法f1()
        function f1(){
            //1.声明赋值局部a
            var a = 1;
            //2.声明方法f2()
            function f2(){
                //6.发现a,在作用域链中寻找a,首先找到了f1()的局部a,并打印
                console.log(++a);
            }
            //3.终止f1运行并返回f2的指针
            return f2;
        }
        //0.声明并运行f1()
        var f = f1();//4.f能够引用f2()方法,因为f还保留f2()的指针,所以f1()留在内存的数据暂且不能销毁。
        f();
        //5.执行f2(),因为f还保留f2()的指针,所以f1()留在内存的数据暂且不能销毁。
        f();
        //6.同上,因为始终保存着f1()的数据,所以以上修改的f1()的a一直都是一个值。
        f();
        //7.同上
        f();
        //8.同上
    

    结果:

    2
    3
    4
    5
    

    原因:
    由于f1的运行结果是返回f2,那么又由于作用域链及函数自身作用域的问题,导致f1运行结束后,不能销毁变量,因此形成了闭包。

  • 相关阅读:
    CentOS7.6配置ip
    查看当前用户下没有主键也没有唯一性索引的表
    C++ 开机自动启动
    C++ 判断是文件还是文件夹
    Duilib热键
    c++将字符转换成字符串
    duilib中各控件响应的消息类型
    Duilib程序添加托盘图标显示
    C++打开文件夹
    C++获取驱动盘句柄
  • 原文地址:https://www.cnblogs.com/fpgz99810/p/12227535.html
Copyright © 2020-2023  润新知