javascript高级编程笔记第五章

chapter 5

5.5 Function类型

未完待续

函数实际上是对象,每个函数都是Function类型的实例,因此与其他引用类型一样具有属性和方法

因此函数名实际上就是函数对象的指针,不会与某个函数绑定

    //因此函数可以这么定义
    // 可以用来理解 函数是对象,函数名是指针
    // 但是不推荐这么定义函数
    const myFun = new Function('num1', 'num2', 'return num1 + num2');

    // 一个函数可以有多个名字
    funtion age() {
        console.log('my age is 19');
    }

    const myAge = age;
    myAge();  // 19
    age();    // 19

5.5.1 没有重载(深入理解)

  1. 把函数名现象做指针,可以帮助理解为何没有重载
  2. 重复声明两个同名函数只会覆盖前一个的引用

5.5.2 函数声明与函数表达式

解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何函数代码前可用。即函数声明提升

5.5.3 作为值的函数

因为函数名本就是一个变量,所以可以将函数作为另一个函数的结合返回
要访问函数的指针而不执行函数的话,必须去掉大括号


    // sort示例
    function compare() {
        return function(object1, object2) {
            const value1 = object1[propertyName];
            const value2 = object2[propertyName];

            if (value1 < value2) {
                return -1;
            } else if (value1 > value2) {
                return 1;
            } else {
                return 0;
            }
        }
    }
    // 调用
    const data = [
        {
            name: 'azoux1',
            age; 19,
        },
        {
            name: 'azoux2',
            age; 190,
        },
    ];
    data.sort(compare, 'name'); // 按name排序
    data.sort(compare, 'age');  // 按age排序

5.5.4函数内部属性

  • 两个特殊的对象
    • this
    • arguments -- 保存函数参数
      • callee属性 -- 指向拥有这个arguments对象的函数
    // 使用callee实现阶乘递归 降低耦合
    function factorial(num) {
        if (num < 2) {
            return 1;
        } else {
            return num * arguments.callee(num - 1);
        }
    }

【松耦合】的方法,一般是底层函数,功能尽量单一,尽量避免修改底层函数。功能相近的函数,可以设计2个以上,不要为了减少代码量,把一个函数的功能设计的太多

5.5.5 函数属性的方法

每个函数包含两个属性:length和property。
其中length是希望接受的参数个数
property是保存所有的实例方法,诸如toString()等...
在es5中property的属性是不可以枚举的(for-in无效)

call()和apply()真正的用武之地不在于传递参数,而是扩充函数赖以运行的作用域

    // 举个例子
    window.color = 'red';
    window.age = 10;
    o = {
        color: 'blue',
    };

    function showColor() {
        console.log(this.color);
        console.log(this.age);
    }

    showColor(); // red
    // red 是因为当前调用showColor的是window对象

    showColor.call(o) //blue
    // call() 扩充了作用域 它会在o对象中寻找color属性,如果没有就是undefined

apply与call相似,只是传入其余参数的方式不同
扩充作用域的最大好处就是对象不需要和方法有任何耦合关系

bind()

bind顾名思义就是绑定,在绑定完传入的对象之后返回一个新的函数
posted @ 2020-06-23 15:23  azoux  阅读(102)  评论(0编辑  收藏  举报