zoukankan      html  css  js  c++  java
  • 【JS】引用类型之Function

    定义方法

    //方法1:推荐
    function sum(value1,value2){
    
    }
    
    //方法2:不推荐
    //原因:如果有调用此方法的代码在这个定义之前就会调用不到(未读取到内存)这个函数而报错,这跟javascript的读取引擎有关
    var sum = function(value1,value2){
    
    }
    
    //方法3:不推荐,在Safari中会导致错误
    var sum = function sum(value1,value2){
    
    }
    
    //方法4:不推荐
    var sum = new Function("num1","num2","rturn num1+num2");

    函数是没有重载的,后面定义的会覆盖前面定义的

    function sum(num1,num2){
        alert(num1 + num2);
    }
    function sum(num1,num2,split){
        alert(split + "," + (num1+num2))
    }
    sum(1,2);//undifined,3

    函数的内部属性

    arguments属性,是一个保存入参的数组对象,但其有一个callee的属性指向拥有arguments属性的函数

    function factorial(num){
          if (num <= 1) {
             return 1;
          } else {
             return num * arguments.callee(num-1);
            //等同于  return num * factorial(num-1);  但是上面的方法更灵活,不受函数名更改的影响,消除了耦合
          }
    }
    
    var trueFactorial = factorial;
            
    factorial = function(){
                return 0;
    };
            
    alert(trueFactorial(5));   //120  递归运算
    alert(factorial(5));       //0

    this属性

    指向该function的拥有者,如果是全局函数this则指向window对象

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

    caller属性

    该属性保存调用的函数的引用,如果是在window环境下该属性值为null

    function outer(){
           inner();
    }
            
    function inner(){
         alert(arguments.callee.caller);//调用了outer.toString()
    }
            
    outer();//弹出outer的定义的源代码

    函数的外部属性和方法

    外部属性

    1、length:表示函数希望接受的参数的个数

    2、prototype:保存着函数的例如valueOf()等函数,只是访问方式是function.valueOf()而已,并且这个属性里的信息是不可以被枚举

    apply方法

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

    call方法

    作用跟apply是一样的,只是接收参数的方式不一样,第一个是参数是执行环境对象,其余的参数必须逐个列举出来传递给函数

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

    apply和call方法的强大之处并非简单的传值调用,而是在于动态的改变函数的运行环境(也就是函数的内部属性this的值)

    window.color = "red";
    var o = { color: "blue" };
            
    function sayColor(){
        alert(this.color);
    }
            
    sayColor();            //red
    
    //调用apply方法一样
    sayColor.call(this);   //red
    sayColor.call(window); //red
    sayColor.call(o);      //blue

    bind方法

    动态改变方法的内部属性this的值

    window.color = "red";
    var o = { color: "blue" };
                               
    function sayColor(){
                alert(this.color);
    }
    var objectSayColor = sayColor.bind(o);
    objectSayColor();   //blue
  • 相关阅读:
    ubuntu :安装skype聊天工具
    ubuntu :安装一个方便的终端工具,Guake Terminal
    ubuntu :安装好了搜狗输入法但是没法用
    Qt学习笔记(1) hello world
    Sublime + python2.7 + opencv (轻量级开发环境)
    Clion + opencv环境搭建(体验最好的C++ IDE)
    最快入门程序员
    isinstance,issubclass
    类的封装,property特性,类与对象的绑定方法和非绑定方法,
    类的继承,派生,组合,菱形继承问题,类的多态和多态性
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/3014505.html
Copyright © 2011-2022 走看看