• 函数的四种调用模式


    函数的四种调用模式实际上就是在讨论一个函数中 this 的指向问题.
    1. 分类
    函数调用模式
    方法调用模式
    构造器调用模式
    上下文调用模式
    bind 模式
    2. 函数调用模式
    分辨: 函数调用没有任何引导数据, 就只有一个函数名来调用.
    在函数调用模式中 this 表示 全局对象( 在浏览器中 就是 window );

        function foo() {
            console.log( this );
        } 
        //函数调用  window
        foo ();
        


    3. 方法调用模式
    分辨: 方法调用模式一定要有一个对象, 是对象引导方法来调用的.
    在方法模式中 this 表示引导对象( 当前对象 )

     //方法调用
        //this指的是object
        var o = { name: 'jim' };
        o.func = foo;
        
        o.func();

    4. 构造器调用模式
    分辨: 方法在调用的时候 前面有一个 new 关键字引导.
    在方法中 this 的含义就是刚刚被创建出来的 对象

    a.构造函数的执行过程原理
    使用 new 创建对象
    构造函数调用, 将刚刚创建的对象引用传入到构造函数中的 this 中
    因此 this 就是当前刚刚创建出来的对象
    利用 对象的 动态特性来给对象增加成员

    在调用 new 的时候, new 后面所跟的函数是什么, 创建出来的对象就继承什么的原型.


    b 构造函数中的 return
    1> 在构造函数中 使用 return 可以结束构造函数的执行. 直接将当前的 this 直接返回.
    2> 如果 return 后跟是一个基本数据类型( 值类型 )或空类型, 这个数据无效, return 起作用.
    3> 如果 return 后跟的是一个引用类型( 对象 ), 那么调用构造函数就会返回该数据. 创建出来的对象就会被 "丢弃"

    //构造器调用模式
        var length = 10;
        function fn(){
            console.log(this.length);
        }
        
        var o = {
            length:5,
            method:function(f){
                f();
                arguments[0]();
            }
        }
        o.method(fn,1);

    5.上下文调用模式
    允许调用者控制函数中 this 的含义, 那么这样的调用就是上下文调用.
    上下文, 就是环境, 依托的对象.
    divElem.getElementsByName( 'div' )
    上下文就是 this
    上下文调用有两个方法可用
    1> apply
    如果函数调用需要提供参数, apply 方法的第一个参数用于指定 函数中 this 的含义.
    如果第一个参数传入的是 null 或 undefined, 那么 this 就是 window.
    如果第一个参数传入的是 基本数据类型( 值类型 ), 那么会将值类型转换成对应的包装类型, this 指向包装对象
    如果第一个参数传入的是 对象, 那么 this 就是这个对象.

    apply 方法的第二个参数是一个数组, 里面包含需要传给函数的所有参数


    2> call
    如果函数调用需要提供参数, call 方法的第一个参数用于指定 函数中 this 的含义.
    如果第一个参数传入的是 null 或 undefined, 那么 this 就是 window.
    如果第一个参数传入的是 基本数据类型( 值类型 ), 那么会将值类型转换成对应的包装类型, this 指向包装对象
    如果第一个参数传入的是 对象, 那么 this 就是这个对象.

    call 方法的第二个参数, 以及其他参数分别表示需要传入函数的各个参数


    共同点: 两个方法都是在指定函数中 this 是指向什么对象.

     // 上下文调用   两种方法apply call
         function method( message, a,b,c,d,e,f,g ) {
            console.log( arguments );
            console.log( message + ', ' + this.name );
        }
        var o1 = { name: '张三' };
        method.apply( o1, [ '消息', 1,2,3,4,5,6,7,8,9,0 ] );
        method.call( o1, '消息', 1, 2, 3, 4, 5, 6, 7 );


    js 是一个弱类型的语言, 而是表示数据不是严格的要求数据类型

    6.bind 模式
    如果说使用 apply 或 call 是在调用的时候指定 this 的含义, 那么 bind 就是在调用之前指定 this 的含义.
    提前绑定. 语法

    函数.bind( 对象 ) -> 函数

     // bind调用
        var tmpFn = document.getElementsByTagName;
        var get = tmpFn.bind( document ); // 返回的还是函数
    
        var dv = get( 'div' )[ 0 ];   
        // 已经隐含了一个条件, 就是说 get 函数中的 this 就是被绑定的对象 即 document
        dv.style.border = '1px dashed green';
        dv.style.width = '100px';
        dv.style.height = '50px';
  • 相关阅读:
    A Philosophy of Software Design
    数据密集型应用-笔记
    百万行超大csv文件如何快速导入mysql
    spring framework源码maven构建版及一点经验总结
    Mac上给应用设置与系统语言不一样的语言设置
    转:how-to-run-junit-springjunit4classrunner-with-parametrized(spring-test如何与junit的Parameterized结合)
    学习数据结构和算法的框架思维(转载)
    进程与线程(廖雪峰进程和线程学习笔记)
    自然语言信息提取结构
    最大熵模型
  • 原文地址:https://www.cnblogs.com/joyce123/p/7306887.html
Copyright © 2020-2023  润新知