zoukankan      html  css  js  c++  java
  • Function 函数

    一、 Function类型

      ① 函数其实是对象,每个函数都是Function类型的实例,一样具有属性和方法,因此,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定

    二、 函数的声明

      ① 函数声明    

        function sum(num1,num2){ 
             return num1+num2    
        }

      ② 函数表达式   

        var sum = function(num1,num2){ 
             return num1+num2;          
        };

      ③ 不推荐声明法

       var sum=new Function("num1","num2","return num1+num2"); 

      函数声明和函数表达式是有区别的,解析器会率先读取函数声明,并使其置于任何代码之前;而函数表达式,则必须等到解析器执行到它所在的代码行,才别执行。

      通俗的讲就是函数声明会自动提升,函数表达式(匿名函数)不会自动提升

        alert(sum(10,10)); //这是正确的,会自动提升,20
        function sum(num1,num2){ 
            return num1+num2; 
        }
        
        alert(sum(10,10)); //这是错误的,匿名函数不会自动提升 
        var sum=function(num1,num2){ 
            return num1+num2; 
        }

      JavaScript中函数是没有重载的,这正是由于函数名其实是一个指针,因此,同名的函数会把之前的指针覆盖掉

        funtion Add(num){ 
            return num + 100; 
        } 
        funtion Add(num){ 
            return num + 200; 
        } 
        var result=Add(100); //300 

    三、 做为值的函数

      因为JavaScript中的函数名本身就是变量,所以函数也可以当作值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回 

        function callSomeFunction(someFunction, someArgument){    
            return someFunction(someArgument); 
        } 
        function add10(num){     
            return num + 10; 
        }  
        var result1 = callSomeFunction(add10, 10); 
        alert(result1);   //20  
        
        function getGreeting(name){     
            return "Hello, " + name; 
        }  
        var result2 = callSomeFunction(getGreeting, "Nicholas"); 
        alert(result2);   //"Hello, Nicholas" 

      这里的callSomeFunction()函数是通用的,即无论第一个参数传递进来是一个什么函数,它都会返回执行执行第一个参数后的结果。当然,大家应该知道,要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对括号

    四、 函数的内部属性

      ① arguments.callee

    在函数内部,有两个特殊的对象:arguments和this,arguments是一个数组对象,包含传入的所有参数,arguments的主要作用是保存函数参数,但这个对象还有个叫callee的属性,该属性是一个指向拥有这个arguments对象的函数,我们看一下下面非常经典的阶乘算法:

          function factorial(num){ 
              if(num<=1){ 
                  return 1;    
              }else{ 
                  return num * factorial(num-1);//与函数名factorial耦合性太高 
              }    
          } 

        上述代码与函数名耦合性太高,一换函数名就不行了,就可以采用以下方法:      

        function factorial(num){ 
            if(num<=1){ 
                return 1;    
            }else{ 
                return num * arguments.callee(num-1);
                //这样无论用什么名字都能完成递归调用  
            }    
        }

      ② this

    函数内部的另一个特殊对象就是this,其行为和java和C#中的this基本类似。换句话说,this引用的是函数据以执行的环境对象(当在网页全局作用域中调用函数时,this对象引用的就是window),来看下面的例子:  

          window.color = "red"; 
          var o = { color: "blue" };  
          function sayColor(){     
              alert(this.color); 
          }  
          sayColor();     //"red"  
          o.sayColor = sayColor; 
          o.sayColor();   //"blue"

        上面这段代码,当在全局作用域中调用sayColor()时,this对象引用的是全局对象window.换句话说,对this.color的求值会转换成对window.color的求值,于是结果返回了"red"。但是当把这个函数    赋给对象o,并调用o.sayColor()的时候,this引用的是对象o,因此对this.color的求值会转换成对o.color的求值,于是结果返回"blue" .

    五、  函数的属性和方法

      ① length属性

        每个函数都包含两个属性,length,length属性表示函数接收的命名参数的个数。    

          function sayName(name){     
              alert(name); 
          }        
          function sum(num1, num2){     
              return num1 + num2; 
          }  
          function sayHi(){     
              alert("hi"); 
          }  
          alert(sayName.length);      //1 
          alert(sum.length);          //2 
          alert(sayHi.length);        //0 

      ② call()和apply()方法 

    这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象指向的值。apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中第二个参数可以是Array的实例,也可以是arguments对象。

          function sum(num1,num2){ 
              return num1+num2; 
          } 
          function callSum(num1,num2){ 
              return sum.apply(this,arguments);  //传入aguments对象 
          } 
          function callSum2(num1,num2){ 
              return sum.apply(this,[num1,num2]);  //传入数组 
          } 
          alert(callSum(10,10));  //20 
          alert(callSum2(10,10)); //20

        call() 方法的第一个参数是作用域没有变化,变化的是其余的参数必须直接传递给函数。

          function sum(num1,num2){ 
              return num1+num2; 
            } 
          function callSum(num1,num2){ 
              return sum.call(this,num1,num2); 
            } 
          alert(callSum(10,10));

        apply()和call()最强大的地方是能够扩充函数赖以运行的作用域。

          window.color="red"; 
          var o ={color:"blue"}; 
          function sayColor(){ 
             alert(this.color); 
          } 
          sayColor();              //red 
          sayColor.call(this);     //red 
          sayColor.call(window);   //red 
          sayColor.call(o);        //blue
  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/Waiting-for-you/p/4095379.html
Copyright © 2011-2022 走看看