• bind


    bind 可以改变方法中的this指向

    /****
     *
     * 语法:fun.bind(thisArg[, arg1[, arg2[, ...]]])
     * 可以利用 bind() 把 fun() 方法中的 this 绑定到 thisArg 对象上, 
     * 并且还可以传进去额外的参数,当返回的绑定函数被调用时,
     * 这些额外的参数会自动传入绑定函数。
     */
    
    var module = {
        a : 2,
        getA : function () {
            return this.a;
        }
    }
    //getA方法中的this指向的是module,所以打印的是2
    console.log(module.getA()); //2
    
    //将方法单独拿出来
    var getA1 = module.getA;
    //方法中的this,这时指向的是全局对象,全局对象没有a,所以打印undefined
    console.log(getA1()); // undefined
    
    //bind返回的是个方法,只是方法的this,指向发生改变了,始终指向的是bind的对象
    var getA2 = module.getA.bind(module);
    console.log(getA2());
    var a = {
        b: function() {
            var func = function() {
                console.log(this.c);
            }
            func();
        },
        c: 'hello'
    }
    a.b(); // undefined 这里的this指向的是全局作用域
    console.log(a.c); // hello
    
    console.log("***********************")
    
    var a = {
        b: function() {
            var _this = this; // 通过赋值的方式将this赋值给that
            var func = function() {
                console.log(_this.c);
            }
            func();
        },
        c: 'hello'
    }
    a.b(); // hello
    console.log(a.c); // hello
    
    
    console.log("***********************")
    
    // 使用bind方法一
    var a = {
        b: function() {
            var func = function() {
                console.log(this.c);
            }.bind(this);
            func();
        },
        c: 'hello'
    }
    a.b(); // hello
    console.log(a.c); // hello
    
    // 使用bind方法二
    var a = {
        b: function() {
            var func = function() {
                console.log(this.c);
            }
            func.bind(this)();
        },
        c: 'hello'
    }
    a.b(); // hello
    console.log(a.c); // hello
    
    console.log("***********************")
    
    // 分析:这里的bind方法会把它的第一个实参绑定给f函数体内的this,所以里的this即指向{x:1}对象;
    // 从第二个参数起,会依次传递给原始函数,这里的第二个参数2即是f函数的y参数;
    // 最后调用m(3)的时候,这里的3便是最后一个参数z了,所以执行结果为1+2+3=6
    // 分步处理参数的过程其实是一个典型的函数柯里化的过程(Curry)
    function f(y,z){
        return this.x+y+z;
    }
    var m = f.bind({x:1},2);
    console.log(m(3)); // 6
  • 相关阅读:
    高效 Java Web 开发框架 JessMA v3.2.3 正式发布
    跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布
    跨平台日志清理工具 Log-Cutter v1.0.3 正式发布
    高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布
    7. Oracle数据加载和卸载
    6. Oracle闪回特性
    5. RAMN备份与恢复
    4. Oracle数据库用户管理备份与恢复
    3. Oracle数据库逻辑备份与恢复
    后台系统依据路由生成tabs标签页
  • 原文地址:https://www.cnblogs.com/moris5013/p/10782323.html
Copyright © 2020-2023  润新知