JavaScript中 call 与 apply、bind 的使用

来源:互联网 发布:网络百家家乐是真的吗 编辑:程序博客网 时间:2024/05/16 18:38

今天遇到一道关于call与apply使用的题目,在此总结一下关于 call 与 apply 的使用方法。

题目如下:以下程序执行结果为3的选项是?

var a = {X:1,Y:2};var b = {    X:2,    Y:2,    add:function(){        return this.X+ this.Y;    }};console.log(b.add.call(a));      //3console.log(b.add.apply(a));     //3console.log(b.excute('1+3'));    //报错console.log(b.add.bind(a));      //返回函数

题目解析:

  • console.log(b.add.call(a));

    通过call(obj)方法将对象b的add方法添加到对象a下。此时a对象为:
    var a = {
    X:2,
    Y:2,
    add:function(){
    return this.X+ this.Y;
    }
    };
    因此,很好理解执行结果为3了。

  • console.log(b.add.apply(a));

    在此时与以上方法相同,它们的区别写在后面。

  • console.log(b.excute(‘1+3’));

    对象b下没有excute这个方法,则报错。

  • console.log(b.add.bind(a));

    此方法将b.add()方法绑定在a下,相当于为a添加了add()方法,但是不是真的复制,执行a.add()也会显示在对象a下找不到add方法。要想显示结果3,可修改为console.log(b.add.bind(a)())。

call 与 apply 方法解读
call 与 apply 都存在于这样的环境下,对象a想要使用对象b中方法,自己比较懒,不想再新建,就出现了call和apply方法,直接使用对象b的方法。

  • 定义:
    调用一个对象的一个方法,以另一个对象替换当前对象。

  • 区别
    根据方法格式就可以看出区别啦!
    call([thisObj[,arg1[, arg2[,[,.argN]]]]]);
    apply([thisObj[,argArray]]);

    区别在于 apply的第二个参数必须是数组或者arguments(参数数组)。call 的第二个参数可以是任意类型,如果为方法传递多个参数,call方法必须逐个制定参数。
    3.说明
    在call 方法中,如果没有提供 thisObj 参数,那么全局对象被用作 thisObj。
    在apply方法中,如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 全局对象将被用作 thisObj, 并且无法被传递任何参数。
    4.bind()方法
    看到一篇总结的比较好的文章,点开了解详细信息吧!Javascript中bind()方法的使用与实现