有关apply,call,bind

本文详细介绍了JavaScript的apply,call,bind函数在改变this指向、参数传递和调用方式上的区别,通过实例展示了它们的用法和功能。
摘要由CSDN通过智能技术生成

有关apply,call,bind

一、apply,call,bind的作用

关于apply,call,bind函数,最主要的作用是用来改变this的指向

apply的用法:
fn.apply(thisArg,[argArr])

作用:修改this的指向并立即执行函数。

区别:这里的第一个参数是改变this所指向的那个对象,而第二个参数是需要传入的值,这个值的数据类型是一个数组

        let obj = {
            name: 'xiaoming',
            age: 24,
            sayHello: function (job,hobby){
                console.log(`我叫${this.name},今年${this.age}岁。我的工作是: ${job},我的爱好是: ${hobby}`);
            }
        }
        // obj.sayHello('程序员','看美女')
        // 这里使用call、apply、bind来更改this的指向然后改变name、age的值,因为job、hobby的值是通过函数传值传入的
        let obj1 = {
            name: 'kunkun',
            age:2.5
        }
        
        obj.sayHello.apply(obj1,['练习生','唱跳rap打篮球'])
        // obj.sayHello.call(obj1,'练习生','唱跳rap打篮球')
        // obj.sayHello.bind(obj1,'练习生','唱跳rap打篮球')
        // obj.sayHello.bind(obj1,'练习生','唱跳rap打篮球')()
call的用法:
fn.call(thisArg, arg1, arg2, arg3, ...)

调用call的时候会将fn中的this指向修改为传入的第一个参数thisArg;将后面的参数传入给fn,并立即执行函数fn。

        let obj = {
            name: 'xiaoming',
            age: 24,
            sayHello: function (job,hobby){
                console.log(`我叫${this.name},今年${this.age}岁。我的工作是: ${job},我的爱好是: ${hobby}`);
            }
        }
        // obj.sayHello('程序员','看美女')
        // 这里使用call、apply、bind来更改this的指向然后改变name、age的值,因为job、hobby的值是通过函数传值传入的
        let obj1 = {
            name: 'kunkun',
            age:2.5
        }
        
        // obj.sayHello.apply(obj1,['练习生','唱跳rap打篮球'])
        obj.sayHello.call(obj1,'练习生','唱跳rap打篮球')
        // obj.sayHello.bind(obj1,'练习生','唱跳rap打篮球')
        // obj.sayHello.bind(obj1,'练习生','唱跳rap打篮球')()
bind的用法:
bind(thisArg, arg1, arg2, arg3, ...)

bind的作用是改变函数fn的this指向,但是不立即执行fn;会返回一个修改了this指向的fn。需要函数调用的时候才会执行:bind(thisArg,arg1, arg2, arg3,...)()

        let obj = {
            name: 'xiaoming',
            age: 24,
            sayHello: function (job, hobby) {
                console.log(`我叫${this.name},今年${this.age}岁。我的工作是: ${job},我的爱好是: ${hobby}`);
            }
        }
        // obj.sayHello('程序员','看美女')
        // 这里使用call、apply、bind来更改this的指向然后改变name、age的值,因为job、hobby的值是通过函数传值传入的
        let obj1 = {
            name: 'kunkun',
            age: 2.5
        }

        // obj.sayHello.apply(obj1,['练习生','唱跳rap打篮球'])
        // obj.sayHello.call(obj1,'练习生','唱跳rap打篮球')
        obj.sayHello.bind(obj1, '练习生', '唱跳rap打篮球')
        obj.sayHello.bind(obj1, '练习生', '唱跳rap打篮球')()

二、apply, call,bind的区别

不同点:
  • call和bind传参方式相同,是传入多个参数依次传入的;
  • apply是传入两个参数,第一个参数改变this指向,第二个参数为需要传入函数的数组或者对象
  • call和apply都是对函数直接调用,而bind方法不会立即调用函数,只是返回一个改变了this指向的函数
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值