day4 函数

一、函数

  函数是什么?  函数就是抽取写好的js代码,作为通用的代码块

       作用:  减少代码冗余(过多)   方便调用(提高效率  提高可读性)   便于维护(二次修改)  
       js有哪些函数
            // 1.系统函数  就是系统自带的函数   alert()   只需要调用
            // 2.内置函数  Math.pow()  属于Math对象的内置函数  只需要调用
            // 3.自定义函数   自己写的函数  先书写后调用
            // 函数主要依赖于function关键词进行定义   一般多函数名以fn开头

        自定义函数的三种声明方式
            // 第一种声明
              // function 函数名(参数一,参数二,参数三....){
              //     函数体(需要进行的操作)
              // }
              function show(){
                  console.log("hello function");//函数体
              }
              //调用    函数名+()
              show()

            // 第二种声明
              // var 变量名=function(){
              //     函数体
              // }
              var fn=function(){//fn就是个变量名  表示当前fn是个函数  fn就是表示这个函数
                  console.log("你好");

              }
              //调用   变量名+()
              fn()

            // 第三种声明  使用new的方式  不常用  凡是使用new的都是对象
              var fn1=new Function("console.log('helll  你好')")
              //调用
              fn1()


        第一种和第二种的区别
        在初始状态页面加载的时候  js会优先加载function以及对应的变量  但是他不会加载变量赋值的过程
       使用function直接写一个函数
        function fn1(){//调用可以放在前面
            console.log("我是函数1");
        }

       使用变量接收一个函数
        var fn2=function(){//调用写在前面就是undefined
            console.log("我是函数2");
        }
       关于fn2调用在变量赋值之前  所以fn2是undefined的值


        return关键词  是用于函数里面返回数据的,没有数据返回的话默认返回undefined
        function fn(){
            console.log("你好");
        }
         fn调用了没有  只要有函数名()  他就会调用
        var a=fn()//调用了一边  a相等于fn返回值  而不是这个函数
        console.log(a);//undefined
        函数参数可以写,可以不写,具体要看对应的参数有没有被使用到
       在函数定义的时候,里面的参数名可以随便写,  因为他是一个形参
        function add(){
            console.log("你是猪");
        }
        因为上面的形参没有被使用到,那我们可以省略这个参数传递
        add()

        两个数相加的方法
        function addnum(num1,num2){
            return num1+num2
        }
       在调用的时候进行参数传递,传递的参数必须要为实参(实际值的参数  常量)
        var num3=addnum(1,2)
        console.log(num3);
        实参的数量要对应形参
        将参数进行传递
        function computer(num01,num02,sym){
            switch(sym){
                case '+':
                    return num01+num02
                    break;
                case '-':
                    return num01-num02
                    break;
                case '*':
                    return num01*num02
                    break;
                case '/':
                    return num01/num02
                    break;
                case '%':
                    return num01%num02
                    break;
                default:
                    console.log("出错了");
            }
        }
        console.log(computer(3,5,'+'));
        当方法执行到return的时候 ,return会结束整个方法  只会结束function不会结束 for  switch

        function fn(){
            arg  参数  arguments 表示的是参数数组,他具备数组的特性 他可以接收用户传递的所有参数
           length属性 获取对应的长度,具备下标获取指定的元素(从0开始)
            console.log(arguments);
        }
        arguments他可以接收任意类型的值
        fn(1,2,3)

        function sum(){
            var res=0
            for(var i=0;i<arguments.length;i++){
                res+=arguments[i]
            }
            return res
        }
        console.log(sum(1,2,3,4,5,6));
        多个参数使用逗号隔开
 
二、变量作用域
 
  变量分为全局变量和局部变量,局部变量为对应的代码块内(function)  不包含 if    switch 以及for
        var a=10//全局变量
        for(var i=0;i<10;i++){
            var a=5//全局变量
            console.log(a);//5
        }
        console.log(a);//5  全局变量
        console.log(i);//10  全局变量


        var b=10//全局变量
        function fn(){
            var b=20//重新声明全局变量b
            console.log(b);//局部变量20
        }
        fn()
        console.log(b);//全局变量  10

        在function里面声明的变量,他的作用域只存在function 对应的全局声明变量是可以存在于全局的

        var c=30//全局变量
        function fn1(){
            c=20//没写var 就是引用全局变量c
            console.log(c);//局部变量20
        }
        fn1()
        console.log(c);//全局变量  20

        全局作用域可以在局部调用,局部不能应用在全局
        全局作用域的东西他对应的可以在局部中更改,局部作用域不能在全局中更改
        局部作用域的代码块不包含if  switch  以及for
 
三、作用域链  函数的嵌套
 
  作用域链
       函数的嵌套
       关于函数的嵌套   如果你调用了最外层的function  那么是不会自动调用内层的   function
        var first=50
        function fn1(){
            var a=10//局部变量
            function fn2(){
                var b=20//局部变量
                function fn3(){
                    var c=30//局部变量
                    function fn4(){
                        var d=40//局部变量
                        //f未定义  找不到f  报错
                        //如果找不到对应的变量就会报错
                        //var f   不赋值  但是找的到  就是undefined
                        //                      +f
                        console.log(a+b+c+d+first);
         //a是fn1的 b是fn2的  c是fn3的  d是fn4的first全局变量
                        //这个逐层向上寻找变量的过程叫做作用域链
                        //什么叫作用域  就是一个变量作用的区域
                    }
                    fn4()
                }
                fn3()
            }
            fn2()
        }
        fn1()
 
posted @ 2022-03-21 17:10  凌晨四点钟  阅读(38)  评论(0)    收藏  举报