JS的call,apply,bind

请看实例代码

var person = {
    name: "CoderXZ",
    age: 26,

    showInfo: function() {
        console.log("I am " + this.name + "," + this.age + " years old!");
    },

    showDetailInfo: function(province, city) {
        console.log("I am " + this.name + "," + this.age + " years old!" + "from " + city + " city," + province + " province!");
    }
}

var person2 = {
    name: "CoderXXXX",
    age: 18
}

//不带参数
person.showInfo();


console.log("-------call-------");
person.showInfo.call(person2);

console.log("-------apply-------");
person.showInfo.apply(person2);

console.log("-------bind-------");
//注意二者的区别
// bind获取的是一个新的函数,如果不加括号,那么他不会被调用!

person.showInfo.bind(person2); //没有()
person.showInfo.bind(person2)(); //有()

从上面的例子可以看出,这三者的作用相同,可以重定向this,从而可以使用属于另一个对象的方法。本例调用 person 的 showInfo 方法,并用于 person2。但是bind有点不一样,bind返回是一个函数,如果你用()去调用它,他是不会执行的。

 

结论1,call()、apply()、bind() 都是用来重定义 this 这个对象的!

再看看传参的情况,

var person = {
    name: "CoderXZ",
    age: 26,

    showInfo: function() {
        console.log("I am " + this.name + "," + this.age + " years old!");
    },

    showDetailInfo: function(province, city) {
        console.log("I am " + this.name + "," + this.age + " years old!" + "from " + city + " city," + province + " province!");
    }
}

var person2 = {
    name: "CoderXXXX",
    age: 18
}

person.showDetailInfo("Hubei", "Huanggang");

console.log("-------call parameter-------");
person.showDetailInfo.call(person2, "Guangdong", "Shenzhen");

console.log("-------apply parameter-------");
person.showDetailInfo.apply(person2, ["Hunan", "Changsha"]);

console.log("-------bind parameter-------");
//注意二者的区别
// bind获取的是一个新的函数,如果不加括号,那么他不会被调用!

person.showDetailInfo.bind(person2, "Zhejiang", "Hangzhou")(); //没有()
person.showDetailInfo.bind(person2)("Zhejiang", "Hangzhou"); //有()

微妙的差距!

从上面四个结果不难看出:

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 person.showDetailInfo(person2,参数1,参数2····)

apply 的所有参数都必须放在一个数组里面传进去 ,person.showDetailInfo(person2,[参数1,参数2····])

bind 除了返回是函数以外,它 的参数和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

 

结论2,对比call 、bind 、 apply 传参方式,call与bind类似,都是直接用逗号隔开。apply略有不同,传参需要传一个数组。参数类型不限。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值