美文网首页
call、apply和bind的区别及用法

call、apply和bind的区别及用法

作者: wjm91 | 来源:发表于2020-05-16 17:13 被阅读0次

    call、apply和bind都是改变函数运行时this的指向。

    先来弄明白this的指向:

    var name = 'mimi', age = 2;

    var obj = {

        name: 'momo',

        objAge: this.age,// 这里的this指的是window

        objFun: function(){

            console.log(this.name+':'+this.age);// 这里的this指的是obj,obj中没有age属性,所以输出是undefined

        }

    };

    console.log(obj.objAge);// 2

    obj.objFun();// momo:undefined  

    call、apply、bind的用法:

    var name = 'mimi', age = 2;

    var obj = {

        name: 'momo',

        objAge: this.age,

        objFun:function() {

            console.log(this.name+':'+this.age);

        }

    };

    var obj2 = {

        name: 'kaixin',

        age: 3

    };

    obj.objFun.call(obj2);// kaixin:3

    obj.objFun.apply(obj2);// kaixin:3

    obj.objFun.bind(obj2)();// kaixin:3

    以上得出结论,call、apply、bind都改变了this的指向,bind返回的是个新函数,必须调用才会执行。

    call、apply、bind参数的对比

    var name = 'mimi', age = 2;

    var obj = {

    name: 'momo',

    objAge: this.age,

        objFun:function(arg1, arg2) {

            console.log(this.name+':'+this.age+',like:'+arg1','++arg2);

        }

    };

    var obj2 = {

        name: 'kaixin',

        age: 3

    };

    obj.objFun.call(obj2,'eat','fight');// kaixin:3,like:eat,fight

    obj.objFun.apply(obj2,['eat','fight']);// kaixin:3,like:eat,fight

    obj.objFun.bind(obj2,['eat','fight'])();// kaixin:3,like:eat,fight

    以上可以看出call、apply、bind的第一个参数都是 this 的指向,后边的参数不同。

    call可以传递过个参数,aplly的参数必须放在一个数组里,bind没有限制,可以传递多个参数,也可以传递数组。

    以上三个方法传递的参数允许是多种类型。

    相关文章

      网友评论

          本文标题:call、apply和bind的区别及用法

          本文链接:https://www.haomeiwen.com/subject/jsrrohtx.html