zoukankan      html  css  js  c++  java
  • 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顾名思义就是绑定,在绑定完传入的对象之后返回一个新的函数
  • 相关阅读:
    java返回json数据日期为一串数字字符串 js 转义
    ==和equals以及hashcode
    【线程分析】
    【dubbo&zookeeper】
    线程安全实现方案
    IOC原理
    java锁
    java特殊运算符
    HashMap原理和TreeMap原理
    volatile与synchronized
  • 原文地址:https://www.cnblogs.com/azoux/p/13182289.html
Copyright © 2011-2022 走看看