zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ShoreWall不错的Linux防火墙 规格严格
    数据挖掘 规格严格
    GLIBC 规格严格
    Solr/Lucene Wiki 规格严格
    Zope??? 规格严格
    用Apache htpasswd管理SVN帐户
    假装
    拼包函数及网络封包的异常处理(含代码)
    云计算
    云计算
  • 原文地址:https://www.cnblogs.com/moris5013/p/10782323.html
Copyright © 2011-2022 走看看