zoukankan      html  css  js  c++  java
  • javascript Function类型

    Function(函数)类型实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针

      声明方式

        function box(number1,number2){                        //1.普通函数声明的方式
                 return number1*number2;
            }
    
    
            var box=function(num1,num2){                        //2.使用变量初始化函数
                return num1+num2;
            }
    
    
            var box=new Function("num1","num2","return num1+num2")         //3.使用new的构造函数来声明函数(不推荐使用 会解析2次代码)

      作为值的函数

        函数名本身就是变量,所以函数也可以作为值来使用,也就是说,不仅可以像传递参数一样把一个函数

    传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回

    function box(sum,name){             
            return sum+name;
        }
    
        function sum(id){
            return id+10;
        }
        var a=box(sum(10),10);              //sum(10)这里传递的是函数的返回值,和普通的变量一样没区别
        alert(a);
    function box(sum,name){             
            return sum(name);
        }
    
        function sum(id){
            return id+10;
        }
        var a=box(sum,10);              //sum在这里是一个函数,当作参数传递到另一个函数中,而不是函数的返回值
        alert(a);

     

    函数的外部属性

      在函数内部,有两个特殊的对象,arguments和this。arguments是一个类数组对象,包含传入函数中的所有参数,主要用途是保存函数参数,但这个对象还有一个名字叫callee的属性,该属性是一个指针,指向拥有

    arguments对象的函数。

        function box(num){
            if (num<=1) {
                return 1;
            }else{
                return num*box(num-1)   //调用自身理解   第一步调用box(4)   4>1返回4*box(3),3>1返回4*3*box(2),2>1 返回4*3*2*box(1),1=1 返回1  最后结果4*3*2*1=24
            }
        }
    
    
    
    
        alert(box(4));

    利用arguments.callee属性来代替

    function box(num){
            if (num<=1) {
                return 1;
            }else{
                return num*arguments.callee(num-1)   //arguments.calle是一个指针可以指向拥有这个arguments函数(也就是自身的意思)
            }
        }

    this:

      其行为与java、C#中的this大致相似,换句话说this引用的是函数据以执行操作的对象,或者说函数调用语句所处的那个作用域,

    ps:当在全局作用域中调用函数时,this对象引用的就是window。

      

    //window是一个对象,是js里面最大的对象,是最外围的
        alert(window);             //返回object window
        alert(this);             //返回object window   所以window=this 
    
        var color="红色的";     //这里的color 就是全局变量,而这个变量又是window的属性
        alert(window.color);     //返回红色的   这里已经很好的说明color是window下面的属性
        window.color="红色的";    //相当与 var color="红色的";
        alert(this.color);         //返回红色的  因为这里的this对象就是window
    this.color="蓝色的";
        alert(color);                                    //这里的color是window下的属性,也就是全局变量
        var box={                                     //创建box对象   属性color    方法sayColor
            color:"红色的",                            //这里的color是box属性下的color,也就是局部变量
            sayColor:function(){
                alert(this.color);                        //这里的this代表的是box对象
            }
        }
    
    
        box.sayColor();                                  //掉用box下的sayColor    不要直接写SayColor
        window.color="蓝色的";
        function sayColor(){
            alert(this.color);
        }
    
        sayColor();                   //返回蓝色的,这里的this 没有对象把它包含,它还是winsow的
        window.color="红色的";
        function sayColor(){
            alert(this.color);
        }
    
        //sayColor();                   //返回蓝色的,这里的this 没有对象把它包含,它还是winsow的
    
        var box={
            color:'蓝色的'    
        }
        box.sayColor=sayColor;             //这段代码相当于 在box里面加了sayColor:function (){alert(this.color)}
        box.sayColor();

    函数的内部属性

    length:来获取函数的参数的个数

    function box(name,age){
            return name*age
        }
    
        alert(box.length);   //返回函数的参数个数

    prototype属性  

      它是保存所有实例方法的真正所在,也就是原型,这个属性我们将在面向对象第一章详细介绍。而prototype下有两个方法,apply()和call(),每个函数都包含这两个非继承而来的方法。这两个方法的用途都在特定的作用域中调用函数

    实际上等于设置函数体内this对象的值

      语法:

        对象.apply(对象,[参数1,参数2.....]);

    function box(name,age){
            return name+age
        }
    
        //利用apply()方法来冒充执行box
        function sum(name,age){
            return box.apply(this,[name,age])          //this表示windows下的作用域,[]表示传递的参数
        }
    
        alert(sum(1,6));                              //调用sum方法返回结果和box一样 冒充成功
        function box(name,age){
            return name+age
        }
    
        //利用apply()方法来冒充执行box
        function sum(name,age){
            return box.apply(this,[name,age])          //this表示windows下的作用域,[]表示传递的参数    apply()和call可以冒充另外一个函数
        }
    
        //alert(sum(1,6));                              //调用sum方法返回结果和box一样 冒充成功
        function sum2(name,age){
            return box.apply(this,arguments);          //如果参数过多我们可以使用argument类数组来代替参数
        }
        alert(sum2(10,20));

    call()方法和apply相同,他们的区别仅仅在于接收参数的方式不同,对于call()方法而言,第一个参数是作用域 没有变化,变化只是其余的参数都是直接传递给函数的

        function box(name,age){
            return name+age
        }
    
        //利用apply()方法来冒充执行box
        function sum(name,age){
            return box.call(this,name,age)          //this表示windows下的作用域,[]表示传递的参数    apply()和call可以冒充另外一个函数
        }
    
        alert(sum(10,20));

      

      

  • 相关阅读:
    flask+Gunicorn+nginx部署
    配置Django实现数据库读写分离
    mysql分库分表
    python的反射
    flask-restful的使用
    spring源码(4)
    spring源码(3)
    spring源码(2)
    spring源码(1)
    tomcat8.5 配置数据源
  • 原文地址:https://www.cnblogs.com/xiaowie/p/9952340.html
Copyright © 2011-2022 走看看