javaScript的function类型

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函数
    

    在这里插入图片描述

  2. 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的引用是函数执行的环境对象

    执行时离函数最近的对象就是执行环境对象,(不管参数中回调函数,因为参数变量引用该回调函数,参数变量的指向还是执行环境对象)

    在这里插入图片描述

    例子1

    function foo(func) {
        func()
    }
    var obj = {
        name: "why",
        bar: function () {
            console.log(this); // window
        }
    }
    foo(obj.bar);
    

在这里插入图片描述

例子2

function foo() {
    console.log(this); // obj1对象
}
var obj1 = {
    name: "obj1",
    foo: foo
}
var obj2 = {
    name: "obj2",
    obj1: obj1
}
obj2.obj1.foo();

在这里插入图片描述

例子3

function foo() {
  console.log(this);//windows
}

var obj1 = {
  name: "obj1",
  foo: foo
}

// 讲obj1的foo赋值给bar
var bar = obj1.foo;
bar();

在这里插入图片描述

  1. caller的指向调用当前函数的函数
    function outer(){
        inner();
    }
    function inner(){
        console.log("inner.caller="+inner.caller);
    }
    //指向调用inner的函数outer
    outer();//inner.caller = function outer(){inner();}
    
  2. 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
    
  3. 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
    })();
    
  4. function的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值