JavaScript 对call()、apply()、bind()的彻底理解(很好懂)

我们想看两个例子:

		var name = "阿清",
            age = 18;
        var obj = {
            name: "阿广",
            objAge: this.age,
            myFun: function() {
                console.log(this.name + "年龄是" + this.age);
            }
        }
        
        console.log(obj.objAge); //18
        obj.myFun(); //阿广年龄是undefined
 		var a = "小明";

        function showname() {
            console.log(this.a);
        }
        showname(); //小明

由这两个例子可以看出来,第一个this指向obj,第二个例子this指向window


我们要知道 call()、apply()、bind() 都是对this的重定向。改变调用函数体内的 this 指向。

如下:

        var name = "阿清",
            age = 18;
        var obj = {
            name: "阿广",
            objAge: this.age,
            myFun: function() {
                console.log(this.name + "年龄是" + this.age);
            }
        }
        var a = {
            name: "小明",
            age: 20
        }
        obj.myFun.call(a); //小明年龄是20
        obj.myFun.apply(a); //小明年龄是20
        obj.myFun.bind(a)(); //小明年龄是20

this 都指向的 a ,除了bind方法后面多了一个(),其他都一样,因为bind返回是一个新的函数,我们必须调用它,才会执行。


call()、apply()、bind() 也可以进行传参:

var name = "阿清",
            age = 18;
        var obj = {
            name: "阿广",
            objAge: this.age,
            myFun: function(from, place) {
                console.log(this.name + "年龄是" + this.age + " ,他的家乡是:" + from + place + "区");
            }
        }
        var a = {
            name: "小明",
            age: 20
        }
        obj.myFun.call(a, "开封市", "祥符"); //小明年龄是20 ,他的家乡是:开封市祥符区
        obj.myFun.apply(a, ["开封市", "祥符"]); //小明年龄是20 ,他的家乡是:开封市祥符区
        obj.myFun.bind(a, "开封市", "祥符")(); //小明年龄是20 ,他的家乡是:开封市祥符区
        obj.myFun.bind(a, ["开封市", "祥符"])(); //小明年龄是20 ,他的家乡是:开封市,祥符undefined区

我们可以看出

  1. call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数就有区别了。
  2. call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面。
  3. apply的参数必须放到一个数组里面才能传进去。
  4. bind 除了返回是一个函数之外,其他都是call 相同。
  5. 参数可以为String类型,函数类型,Object类型等等各种类型。



愿你的坚持终有收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值