js中call、bind、apply的作用及区别?

1、相同点:

  修改函数运行时this的指向

  如果第一个参数是undefined或者nullthis默认指向window

2、区别:

function fun(...argus) {
        console.log(this);
        console.log(...argus);
    }

    let person = {
        myName: '王五'
    }

2.1、apply

需要两个参数:
  ①:this指向,②函数接收的参数,以数组的形式传入。

  改变this指向后原函数会立即执行,临时改变this指向一次

 	fun.apply(person,[1,2,3,4]);//将this指向person
    fun(5,6,7,8,9);//this指向window
    //如果第一个参数是undefined或者null,this默认指向window
    fun(undefined,[1])
    fun(null,[2])

在这里插入图片描述
在这里插入图片描述

2.2、call

需要两个参数:
  ①:this指向,②函数接收的参数,以参数列表的形式传入。

  改变this指向后原函数会立即执行,临时改变this指向一次

/*两个参数:1、this的指向,2、参数列表*/
    fun.call(person, [123], 234, 456)

在这里插入图片描述

2.2.1、手写call原理实现

原理:函数,作为对象的属性,由对象调用,可以改变函数的this,这叫隐式绑定。

//手写一下call的原理实现,重在思路
Function.prototype.myCall = function () {
    console.log(arguments);//{ '0': { name: '我是小方', age: 18 }, '1': 1, '2': 2, '3': 3 }
    let _o = arguments[0];
    console.log(this);//this指向fn这个函数
    //添加自定义属性,fn
    _o.fn = this;
   // .slice,从数组中选择元素并返回
    const args=[...arguments].slice(1)
    //由对象调用
   // 把函数绑定在对象的属性上,并由对象调用,进而改变函数的this
    _o.fn(args);//我是小方
}
let obj = {
    name: "我是小方",
    age: 18
}

function fn() {
    console.log(this.name);
}

fn.myCall(obj, 1, 2, 3)

在这里插入图片描述

2.3、bind

需要两个参数:
  ①:this指向,②函数接收的参数,以参数列表的形式传入。

  改变this指向后原函数不会立即执行,会返回一个永久改变this指向的函数

let bindFun = fun.bind(person,1, 2, 3, 4, 5, 6, 7);
    //可以多次调用,不论调用多少次this指向的都是person
    bindFun();
    bindFun(111,222,333);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值