简单聊聊JS中call和apply的原码及区别

简单聊聊JS中call和apply的原码及区别

  • 前言
  • call
    • 测试示例
  • apply
    • 测试示例
  • 区别

在这里插入图片描述

前言

在JavaScript中,每个函数对象都带有call()apply()方法,即Function.prototype.call()Function.prototype.apply(),这两个方法都是挂载在原型上的。

call

上一期我们比较详细的记录了手写call

我们在简单回顾一下:
定义:call()使用一个指定的this值和单独给出的一个或多个参数来调用一个函数。

//直接写简化版的咯,想看详细版的小伙伴可以看上一期,写的很详细的哟~
Function.prototype.call = function(context, ...args) {// 判断是否是undefined和nullif (typeof context === 'undefined' || context === null) {context = window}let fnSymbol = Symbol()context[fnSymbol] = thislet fn = context[fnSymbol](...args)delete context[fnSymbol] return fn
}

测试示例

var value = 2;
var obj = {value:1
};
function bar(name,age){return{value:this.value,name:name,age:age}
}
bar.call(obj,null);//1
console.log(bar.call(obj,'ken',12));
//{ value: 1, name: 'ken', age: 12 }

apply

apply的实现跟call类似,只是入参不一样,apply为数组。
定义:apply()方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。

Function.prototype.apply = function(context,arr){var context = Object(context)||window;context.fn = this;var result;if(!arr){result = context.fn();}else{result = context.fn(...arr);}delete context.fn;return result;
}

最简化版方式:

Function.prototype.apply2 = function(context,args){//判断是否是undefined和nullif(typeof context === 'undefined' || context === null){context = window;}let fnSymbol = Symbol();context[fnSymbol] = this;let fn = context[fnSymbol](...args);delete context[fnSymbol];return fn;
}

测试示例

var value = 2;
var obj = {value:1
};
function bar(name,age){return{value:this.value,name:name,age:age}
}
console.log(bar.call(obj,'kin',13));
{ value: 1, name: 'kin', age: 13 }

区别

1、相同点:
callapply两个方法最主要的作用就是改变this指向。


2、不同点:
传递的参数不同
call()方法接收的是参数列表,而apply()方法接收的是一个参数数组。


使用方法:

  • call:
    - function.call(thisArg,arg1,arg2,…)
  • apply:
    - function.apply(thisArg,[argsArray])

参数说明:
thisArg:函数在运行时的this值,如果函数处于非严格模式下,则指定为nullundefined时会自动替换为指向全局对象。
arg1,arg2,…和[argsArray]:函数接收的参数列表。

来吧!让满满的知识装进脑袋里,继续让我们脑子里的知识发光发热!
在这里插入图片描述