十分钟弄懂js的call(),apply(),bind()

其实很简单,十分钟看完从一脸懵逼到完全理解。

先看下面的例子

例1

var name = '张三',age = '18'
var obj = {
    name:'李四',
    objAge:this.age,
    fn:function(){
        console.log('名字:' + this.name,'年龄:' + this.age)
    }
}
console.log(obj.objAge)
obj.fn();

例2

var name = '王五'
function shows(){
    console.log('名字:' + this.name)
}
shows()

 

 仔细对比这两个例子的this指向是不同的,一个指向obj,一个指向window

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

var name = '张三',age = '18'
var obj = {
    name:'李四',
    objAge:this.age,
    fn:function(){
        console.log('名字:' + this.name,'年龄:' + this.age)
    }
}
var changeThis = {
    name:'王五',
    age:'0'
}
obj.fn.call(changeThis);
obj.fn.apply(changeThis);
obj.fn.bind(changeThis)();

 

以上出了 bind 方法后面多了个 () 外 ,结果返回都一致!

由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

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

var name = '张三',age = '18'
var obj = {
    name:'李四',
    objAge:this.age,
    fn:function(lz,qw){
        console.log('名字:' + this.name + '年龄:' + this.age + '来自' + lz + '去往' + qw)
    }
}
var changeThis = {
    name:'王五',
    age:'0'
}
obj.fn.call(changeThis,'北京','上海');
obj.fn.apply(changeThis,['成都','上海']);
obj.fn.bind(changeThis,'长沙','武汉')();
obj.fn.bind(changeThis,['长沙','武汉'])();

 

微妙的差距!

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

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

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.fn.call(changeThis,'北京', ... ,'string' )。

apply 的所有参数都必须放在一个数组里面传进去 obj.fn.apply(changeThis,['成都', ..., 'string' ])。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值