美文网首页
基本概念--函数

基本概念--函数

作者: 娇娇_5038 | 来源:发表于2022-01-30 12:42 被阅读0次

    1.函数的定义

    1.1函数语句

    案例一 这个案例没有return ,这个函数返回的是 undefined

    let o={

                x:1,

                y:2,

                z:3

            }

            function printprops(o){

                for(let p in o){

                    console.log(`${p} : ${o[p]}`)

                }

            }

           console.log(printprops(o));

    案例二 计算两个笛卡尔坐标(x1,y1)和(x2,y2)之间的距离,  这个函数返回的是Math.sqrt(dx*dx+dy*dy)

           function distance(x1,y1,x2,y2){

               let dx=x1-x2;

               let dy=y1-y2;

               //Math.sqrt() 函数返回一个数的平方根

               return Math.sqrt(dx*dx+dy*dy)

           }

           console.log(distance(5,7,7,9))

    计算阶乘的递归函数(调用自身的函数)

    x!的值是从x到x递减的值的累乘

    比如x为4  最后的结果4*3*2*1

           function factorial(x){

               if(x<=1){

                   return 1;

               }else{

                   return x*factorial(x-1);

               }

           }

           console.log(factorial(4));

    1.2函数表达式

            let squary=function(x){

                return x*x;

            }

            //函数表达式可以包含名称,这在递归时很有用

            let f=function fact(x){

                if(x<=1){

                    return 1;

                }else{

                    return x*fact(x-1)

                }

            }

           console.log(f(5));//120

           //函数也可以作为参数传给其他函数

           let data=[5,100,367,293,31,20];

           data.sort(function(a,b){

               return a-b;

           })

           console.log(data);//[5, 20, 31, 100, 293, 367]

           //函数表达式有时定义后立即调用

           let tensquared=(function(x){

               return x*x;

           })(13);

           console.log(tensquared);//169

    2.函数命名规则

    2.1嵌套函数,在js中函数可以嵌套在其他函数中,内嵌的函数不能出现在循环,条件判断

    function hypotenuse(a,b){

              function  square(x){

                  return x*x;

              }

              return Math.sqrt(square(a)+square(b))

          }

          console.log(hypotenuse(5,5));

    3.函数调用

    四种方式可以来调用js函数

    ● 作为函数

    ● 作为方法

    ● 作为构造函数

    ● 通过它们的call() 和apply()的方式调用

    3.1作为函数

    let o={

                x:1,

                y:2,

                z:3

            }

            function printprops(o){

                for(let p in o){

                    console.log(`${p} : ${o[p]}`)

                }

            }

           console.log(printprops(o));

    3.2作为方法调用

     var o = {

            method: function () {

                console.log(1)

            }

           }

           o.method();

    注●如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式)就是undefined(严格模式)

      let o={

                 m:function(){

                     var self=this;

                     console.log(this==o);

                     f();

                     function f(){

                         console.log(this);//false  window undefined

                         console.log(self==o);//true

                     }

                 }

             }

             o.m()

    3.3 作为构造函数调用

    如果函数和方法调用之前加关键字new,它就构成了构造函数

    let o=new Object();     let o=new Object;

    3.4通过它们的call() 和apply()的方式调用

    改变this指向 下面的案例this指向了sum

    call和apply()区别是传递的参数不同

    function add(c,d){

             console.log(this)

             return this.a+this.b+c+d;

         }

         let sum={

             a:1,

             b:2

         }

         let res= add.call(sum, 10, 2);//this 的指向是sum

         console.log(res);

         let res1=add.apply(sum,[20,21]);//44 this 的指向是sum

         console.log(res1)

    4.函数的实参和形参

    4.1.可选形参 当调用函数的时候传入的实参比函数声明时指定的参数个数要少,剩下的形参都将设置为 undefined

    function getPropertyNames(o,a){

       a= (a == undefined) ? []:a;

        for(let item in o){

            a.push(item)

        }

        return  a;

    }

    let o={

        x:1,

        y:2,

        z:3

    }

    let p={

        q:4

    }

    let res=getPropertyNames(o);

    console.log(res);// ['x', 'y', 'z']

    let res1=getPropertyNames(p,res);

    console.log(res1);//['x', 'y', 'z', 'q']

    4.2可变的实参列表:实参对象

    可以通过arguments获取实参的个数

    function f(x,y,z){

        console.log(arguments.length);

    }

    f(1,2)

    callee 和 caller 可以通过callee 递归的调用自身

    function f(x,y,z){

        console.log(arguments.callee);//

    }

    f(1,2);

    将对象的属性作为实参

    function arraycopy(from,form_start,to,to_end){

    console.log(from,form_start,to,to_end)

    }

    function easycopy(obj){

        arraycopy(obj.form,obj.form_start,obj.to,obj.to_end)

    }

    easycopy({form:'a',form_start:'b',to:'c',to_end:'d'});

    5 作为值的函数

    作为值的函数

    function square(x){

        return x*x;

    }

    let s=square;

    square(2);//4

    s(2);//4

    //案例二
    function add(x,y){

        return x+y;

    }

    function substrac(x,y){

        return x-y;

    }

    function mutiplay(x,y){

        return x*y

    }

    function divide(x,y){

        return x/y

    }

    function operate(operator,operand1,operand2){

        return operator(operand1,operand2);

    }

    console.log(operate(add,operate(add,2,3),operate(mutiplay,3,4)));//17

    6.闭包

    当一个函数嵌套另外一个函数,外部函数将嵌套的函数对象作为函数值返回,这就是闭包
    let scope='global scope';

    function checkscope(){

        let scope='local scope';

        function f(){

            return scope;

        }

        return f();

    }

    console.log(checkscope());//local scope

    function counter(){

        let n=0;

        return{

            count:function(){ return n++; },

            reset:function(){ n=0; }

        }

    }

    var c=counter();

    var d=counter();

    console.log(c.count());//0

    console.log(d.count());//0

    console.log(c.reset());

    console.log(c.count());//0

    console.log(d.count());//1

    ss

    相关文章

      网友评论

          本文标题:基本概念--函数

          本文链接:https://www.haomeiwen.com/subject/nwrqkrtx.html