• JavaScript基础知识整理(引用类型-Function)


    Function

    Function类型实际上是对象,每个函数都是Function类型的实例,自然也就具有属性和方法。


    定义函数通常有三种方式

    使用函数声明

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

    使用函数表达式

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

    使用Function构造函数(因为解析代码次数会增加,所以不推荐用这种方式)

    var sum = new Function("num1","num2","return num1 + num2");//最后一个参数作为函数体,其余参数为创建函数的参数

    函数声明方式声明的函数会先被解析器读取,在其他代码执行前,这种函数已经处于能被访问的状态了


     函数名实际上是指向函数对象的指针,所以函数名和函数并没有互相绑定,多个函数名可以指向同一个函数,在其他oo语言中会有函数重载,ECMAScript中并没有,因为当出现具有相同名称而内容不同的函数时,函数名指向了最新的函数,也就不存在同时表示多个函数体的情况了。

    var sum = function(num1,num2){
         return num1 + num2;
    }
    alert(sum(5,5));//10
    var anotherSum = sum;
    alert(anotherSum(5,5));//10
    sum = null;
    alert(anotherSum(5,5));//10
    var add = function(num){
          return num + 100;  
    };    
    var add = function(num){
          return num + 200;     
    };
    var result = add(100);//300

    函数作为变量可以作为参数传递给另一个函数,也可以通过函数返回一个函数

    function callSomeFunction(someFunction,someArgument){
            return someFunction(someArgument);
    }
    function add(num){
            return num + 10;
    }    
    var result = callSomeFunction(add,10);//20

    函数内部有三个特殊对象,arguments,this,caller.arguments作为一个与数组类似的对象,保存着传给函数的参数,并且拥有一个callee属性,指向函数本身。

    这个callee属性可以解除函数名与函数体的耦合。(通常在函数调用本身时发挥作用)

    function factorial(num){
           if(num <= 1){
                  return 1;
           }else{
                  return num * arguments.callee(num - 1); //不仅仅把函数名局限于factorial
           }
    }                    
    var newFactorial = factorial;
    factorial = new function(){
            return 0;
    }
    alert(newFactorial(5));//120
    alert(factorial(5));//0

    this对象引用的是函数的运行环境对象

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

     caller属性保存着调用当前函数的函数的引用,也就是上一级函数的引用。


    函数拥有两个非继承属性和三个非继承方法分别是length,prototype,apply(),call()和bind().

    length表示函数希望接收的命名参数的个数,prototype是一个指向函数原型的指针,这在模拟继承上有很大的作用。

    apply()和call()可以让函数作用在某个特定的作用域,这样可以扩充函数能够运行的作用域。

    apply()接收两个参数,第一个参数是指定函数在哪个作用域中调用,第二个参数是参数数组(可以是Array的实例也可以是arguments对象)。

    function sum(num1,num2){
           return num1 + num2;
    }
    function callSum1(num1,num2){
           return sum.apply(this,arguments);      
    }
    function callSum2(num1,num2){
           return sum.apply(this,[num1,num2]);      
    }
    alert(callSum1(5,5));//10
    alert(callSum2(5,5));//10

    call()与apply()基本相同,不同之处在于接收参数的方式,call()接收参数时,必须把参数逐个列举出来,老老实实一个对应一个。

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

    bind()可以创建一个函数实例,这个实例改变了其函数的this,让其this指向传给bind()的参数

    window.color = "red";
    var obj = {color : "green"};
    function sayColor(){
          alert(this.color);  
    }
    var objSayColor = sayColor.bind(obj);
    objSayColor();//"green"
  • 相关阅读:
    fstream的使用方法
    Java按键事件KeyEvent
    java之 22天 GUI 图形界面编程(二)
    java之 22天 GUI 图形界面编程(一)
    java使用省略号代替多参数(参数类型... 参数名)
    jsoup
    C++获得本机所有网卡的IP和MAC地址信息
    otl中遇到的一些字符数组长度问题
    otl使用存储过程或是LEFT JOIN时提示输出类型未知的问题
    Android:布局实例之常见用户设置界面
  • 原文地址:https://www.cnblogs.com/xianglan666/p/12968871.html
Copyright © 2020-2023  润新知