浅谈bind,call,apply的区别

不同点

fn.bind(obj)返回的是一个函数

fn.call(obj,parm1,parm2)返回的是一个处理结果

fn.apply(obj,[parm1,parm2])返回的是一个处理结果

相同点

它们共同的作用是改变函数里面 this 的指向。

举例

var g = 3;        // 全局变量 window的属性

let obj1 = {
    g:30
}

let obj2 = {
    id: Symbol("ids"),
    g:300,
    c:function() {
        return this.g;
    }
}
/*常态下调用obj2的c方法*/
console.log(obj2.c(),"obj2.c()");

//调用obj2的c方法在链式调用bind方法
console.log(obj2.c.bind(window),"obj2.c.bind(window)")
console.log(obj2.c.bind(obj1),"obj2.c.bind(obj1)")

//调用obj2的c方法在链式调用call方法
console.log(obj2.c.call(obj1),"obj2.c.call(obj1)")

//调用obj2的c方法在链式调用apply方法
console.log(obj2.c.apply(obj1),"obj2.c.apply(obj1)")

结果

 

 

 

如何传参

var g = 3;        // 全局变量 window的属性

let obj1 = {
    g:30
}

let obj2 = {
    id: Symbol("ids"),
    g:300,
    c:function(parms1,parms2) {
        console.log(parms1+parms2);
    }
}

//传参数给bind
obj2.c.bind(obj1)(1,1);

//传参数给call
obj2.c.call(obj1,2,2)

//传参数给apply
obj2.c.apply(obj1,[3,3])

 

 

posted @ 2020-06-22 21:57  正义de键盘侠  阅读(540)  评论(0)    收藏  举报