bind

400 阅读2分钟

什么是bind

bind是函数的一种方法; bind()方法会创建一个新函数。当这个新函数被调用时,bind()的第一个参数将作为它运行时的this,之后的参数会当做新函数的实参传入。

举实例说明

function fn(){
    console.log([...arguments]);
    console.log(this);
}
var obj = {
    a:123,
    b:321
}
var f = fn.bind(obj,6,6,6);
<!--console.log(f);-->
<!--console.log(f===fn);-->
f();

执行结果:

f执行 让 fn执行; 并且把 6,6,6,6传给fn;fn中的this 指向是 obj;把 6,6,6,6 理解成 f 的默认参数;再给f传递参数的时候;会把传递的参数补在 默认参数的后边

新函数f和fn虽然长得一样,但是他们是不同的地址,所有console.log(f===fn)结果为false;

bind 用法跟call 一样; bind的返回值是一个新函数;新函数执行时 函数Fn才会执行,并且才会修改Fn的this指向, 新函数执行时也可以传入参数,不传参就默认bind执行时候的参数

自己实现bind

根据bind原生特点:

  • 返回新函数
  • 新函数执行可传入参数

一、返回一个新函数

Function.prototype.myBind1 = function(context){
    var that = this;
    return function(){
        return that.apply(context);
    }
}
var f2 = fn.myBind2(obj);
f2();

返回一个函数,并且新函数有返回值,利用apply来修改this指向

二、返回的函数可以传入参数

Function.prototype.myBind2 = function (context,..arg){
    var that = this;
    return function(..ary){
        return that.apply(context,arg.concat(ary);
    }
}
var f3 = fn.myBind2(obj,4,5,6);
f3(6,6,6);

三、构造函数

如果用new 的方式来执行新函数,默认的this会失效

function fn() {
            console.log([...arguments]);
            console.log(this);
        }
        var obj = {
            a: 123,
            b: 321
        }
        Function.prototype.myBind = function (context, ...arg) {
            const that = this;
            arg = arg || [];
            return function f(...ary) {
                if (this instanceof f) {
                    return new that(...arg, ...ary);
                }
                return that.apply(context, [...arg, ...ary]);
            }
        }
        var f = fn.myBind(obj,1,2,3,4);
        var ff = new f(6,6,6);
        // console.log(ff===f);