加载中...
  • JavaScript 中 call()、apply()、bind() 的用法与区别

    大家都知道 call()、apply()、bind() 都可以改变js中的js指向,这里我们来看这三者的区别

    我们先来一个普通的实例
    例1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var name = '张三';
    var age = 17;
    var obj = {
    name:'李四',
    objAge:this.age,
    fn: function(){
    console.log(this.name,this.age)
    }
    }
    obj.objAge //17
    obj.fn(); //张三 undefined

    例2:

    1
    2
    3
    4
    5
    var str = '你好';
    function (){
    console.log(this.str)
    }
    show() // 你好

    比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

    让我们来用 call()、apply()、bind() 都是用来重定义 this 这个对象的,看看是什么效果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var name = '张三';
    var age = 17;
    var obj = {
    name:'李四',
    objAge:this.age,
    fn: function(){
    console.log(this.name,this.age)
    }
    }
    var obj2 = {
    name:'李白',
    age:100
    }
    obj.fn().call(obj2); // 李白
    obj.fn().apply(obj2); // 李白
    obj.fn().bind(obj2)(); // 李白

    以上出了 bind 方法后面多了个 () 外 ,结果返回都一致!
    由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

    对比call 、bind 、 apply 传参情况下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var name = '张三';
    var age = 17;
    var obj = {
    name:'李四',
    objAge:this.age,
    fn: function(a,b){
    console.log('姓名:'+this.name,'年龄:'+this.age,a,b)
    }
    }
    var obj2 = {
    name:'李白',
    age:100
    }
    obj.fn.call(obj2,1,2); // 李白 100 1 2
    obj.fn.apply(obj2,[1,2]); // 李白 100 1 2
    obj.fn.bind(obj2,[1,2])(); // 李白 100 1 2 undefinde

    从上面结果来看可以得知
    call,apply,bind 这三个函数的第一个参数都是this的指向对象,而差别在于第二个参数

    call:参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面
    obj.fn.call(obj2,1,2,………………);

    apply:所有参数都必须放在一个数组里面传进去
    obj.fn.apply(obj2,[1,2,……………..]);
    bind 差别在于它不会进行调用,需要进行另外的手动调用,它 的参数和 call 一样。

    看起来是不是很简单啊,哈哈

    上一篇:
    浅拷贝和深拷贝
    下一篇:
    理解 JavaScript 的 async/await
    本文目录
    本文目录