JavaScript的function对象

317 阅读2分钟

function类型

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法

函数是对象,函数名是指针

  1. function的创建
    声明式创建
    function add(num1, num2) {
        return num1 + num2;
    }
    
    表达式创建
    var sub = function (num1, num2) {
        return num1 - num2;
    };
    var sub2 = sub;
    console.log(sub2(1, 3));//-2
    
  2. function没有重载

    函数名相同但必须在下列一个或两个方面有所区别的两个函数:

    1、函数的参数个数不同。

    2、函数的参数类型不同或者参数类型顺序不同

    function没有重载,只有覆盖

    function sum(num1, num2) {
        return num1 - num2;
    };
    function sum(num1, num2) {
        return num1 - num2 + 10;
    };
    // 前面的函数覆盖了前面的函数
    console.log(sum(2, 5));//7
    
  3. function的声明式提升

    预解析

    预解析会做什么?

    变量的值会定义成undefind 函数声明式会被解析在 当前所在的作用域的的最上边

    (function () {
        console.log(sum(1, 4));
        function sum(num1, num2) {
            return num1 - num2 + 10;
        };
    
        // 下面代码会报错
        console.log(add(1,4));
        var add=function (num1,num2){
            return num1+num2;
        };
    })();
    

    函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖

    (function () {
        console.log("打印的第一个a为" + a);//函数
        function a() {
            console.log("aaaaa");
        }
        var a;
        a = 1;
        console.log("打印的第二个a为" + a);//打印的第二个a为1
    })();
    

  1. 作为值的函数

    参数可以是函数,返回值也可以是函数

    function callback(name) {
        console.log(name+"执行callback函数")
    }
    function doSomeThing(callback) {
        let name = "小米"
        callback(name);
    }
    
    doSomeThing(callback);//小米执行callback函数
    

  1. function的arguments对象
    function f1() {
        //使用arguments对象可以获取传入的每个参数的值
        console.log(arguments);
        for(let i = 0;i<arguments.length;i++) {
            console.log(arguments[i])
        }
        console.log(arguments.length);
        console.log(arguments.callee);
    }
    f1(10, 3, 34, 5, 2, 0);
    

  1. function的this指向

    this指向

  2. caller的指向调用当前函数的函数
    function outer(){
        inner();
    }
    function inner(){
        console.log("inner.caller="+inner.caller);
    }
    //指向调用inner的函数outer
    outer();//inner.caller = function outer(){inner();}
    
  3. function的属性

    length属性

    function sayName(name) {
        console.log(name);
    }
    function sum(num1, num2) {
        return num1 + num2;
    }
    console.log(sayName.length);//1
    console.log(sum.length);//2
    
  4. function的prototype属性改变绑定执行环境对象的方法

    (1)apply方法(执行函数环境对象,arguments/参数数组)

    (function () {
        function sum(num1, num2) {
            return num1 + num2;
        }
        function callSum1(num1, num2) {
            console.log(this);//window对象
            // apply调用特定函数
            return sum.apply(this, arguments);
        }
    
        function callSum2(num1, num2) {
            console.log(this);//window对象
            // apply调用特定函数
            return sum.apply(this, [num1, num2]);
        }
    
        console.log(callSum1(10, 10));
        console.log(callSum2(10, 10));
    })();
    

    (2)call方法(执行函数环境对象,参数1,参数2...)

    (function () {
        function sum(num1, num2) {
            return num1 + num2;
        }
        function callSum(num1, num2) {
            // call调用特定函数,调用的参数必须逐个列举
            return sum.call(this, num1, num2);
        }
        console.log(callSum(10, 20));//30
    })();
    

    (3)bind方法

    (function() {
        window.color = "red";
        var obj = {
            color: "blue"
        };
        function sayColor() {
            console.log(this.color);
        }
        //bind方法会创建该函数的新实例,并把该实例绑定在放在参数位置的对象中
        var objSayColor = sayColor.bind(obj);
        objSayColor();//blue
        sayColor();//red
    })();
    
  5. function的方法