call、apply、bind 的区别?

说到call、apply、bind,其最主要的作用,是改变 this 的指向!!!

1.call、apply、bind 的简单使用

这三者都是函数的一个方法,那么使用的方式就出来了 .call() 、 .apply() 、.bind()
示例:

//  定一个普通函数
function func() {
	console.log(this)
}

// 正常调用函数
func(); // window

// 使用call调用函数
func.call(); //  window

// 使用apply调用函数
func.apply(); // window

// 使用bind调用
let reason = func.bind() // 不会执行函数,但是会返回一个函数
reason(); // window

总结1:

call、apply 会直接调用函数,bind不会直接调用但会返回一个函数

2.call、apply、bind 来改变this指向

        var name = '丽丽'
        function func() {
            console.log(this, this.name)
        }
        let person = {
            name: '大丽'
        }

        // 正常调用
        func(); // window, 丽丽

        // 改变this指向
        func.call(person); // person, 大丽
        func.apply(person);// person, 大丽

        let reason = func.bind(person);
        reason()// person, 大丽

总结2:

call、apply、bind 都可以改变this的指向,如果不传,则默认为全局对象 window

3.call、apply、bind 传参

        let animal = {
            name: '安安',
            sayName: function (p1, p2, p3) {
                console.log(`我叫${this.name},我的主人叫${p1},她有时${p2},有时${p3}`)
            }
        }
        let cat = {
            name: '依安'
        }

        // 正常调用
        animal.sayName('丽丽', '暴躁', '温柔'); // 我叫安安,我的主人叫丽丽,她有时暴躁,有时温柔
        // 改变this指向,并传参
        animal.sayName.call(cat, '丽丽', '暴躁', '温柔'); // 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔
        animal.sayName.apply(cat, ['丽丽', '暴躁', '温柔']);// 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔

        let reason = animal.sayName.bind(cat, '丽丽', '暴躁', '温柔');
        reason()// 我叫依安,我的主人叫丽丽,她有时暴躁,有时温柔

总结3:

call、bind可接受N多个参数

  • 第一个参数为this指向的对象
  • 自第二个参数起,均为映射函数的参数

apply只能接受两个参数

  • 第一个参数为this指向的对象
  • 第二个参数为一个数组,数组的元素均为映射函数的参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值