JavaScript基本功之apply/call/bind使用和实现原理

本文对比了JavaScript中的apply、call和bind方法,详细介绍了它们的使用场景、实现原理以及相关示例。应用包括数组操作、方法继承、变量类型判断等。同时,文章还探讨了如何手动实现这三个方法,特别关注了bind方法的this执行、参数传递和new对象创建的特性。
摘要由CSDN通过智能技术生成

apply/call/bind 比较

  • 参数: apply传入数组,call/bind传入多参数,bind还能在运行时继续传参
  • 执行: apply/call立即执行,bind不会立马执行

apply的使用

用途

  • 劫持方法,继承其他对象的属性.
  • 可将数组参数转化为多参数(es6的运算扩展符也有这功能)

语法

  • fun.apply(thisArg, [argsArray])
  • thisArg:fun 运行时指定 this
  • argsArray:接收数组类型,执行时将数组转换为多参数

例子:

  • fun.apply(obj, [a,b,c]) => fun(a,b,c)
  • fun内涉及的this对象会指向obj

常见用途

  • 数组最大最小值。
  • Max.max和Max.min参数类型是多参数形式

如何实现apply?

// apply本身功能
console.log(Math.max(4,1,3)); 
console.log(Math.max.apply(null, [4,1,3])); 
// 4
// 4
// 实现apply
Function.prototype.apply = function fn(context,param){
   
    console.log(`my apply...`);
    // 1. 修改方法内部this指向 => ctx 
    let ctx = context ? context : window;
    ctx.fn = this; // this是当前方法,fn调用者是ctx(因此fn内this指向ctx)
    // 2.参数转换: 只有数组需要
    if(Array.isArray(param)){
   
        // 字符串和数组相加,数组会自动转为字符串  例如'test ' + [1,2,3] => 'test 1,2,3'
        return eval('ctx.fn(' + param + ')'); 
    }else{
   
        return ctx.fn();
    }
}    
// TEST
console.log(Math.max(4,1,3)); 
console.log(Math.max.apply(null, [4,1,3])); 
// 4
// my apply...
// 4

call语法

  • fun.call(obj, param1, param2....)
  • obj:代替fun里this对象
  • params:接收多参数类型,没有任何转换

使用场景

[].slice.call(arguments)

需要先了解slice语法

  • slice(startIndex, endIndex) 切片数组,原数组不变,返回新数组
  • startIndex 默认是0,endIndex 默认是最后元素下标
  • slice() 返回整个数组
  • slice(1) 返回index=1开始到最后元素的数组
a=['a','b','c'];
b=a.slice();
c=a.slice(1);
console.log('a=',a); 
console.log('b=',b); 
console.log('c='
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值