实现call函数,手写Function.prototype.call函数

本文详细介绍了如何在JavaScript中自定义实现call方法的过程。通过逐步分析,解释了call方法内部的工作原理,包括如何更改函数执行时的上下文,以及如何处理参数传递等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现call函数:

使用call函数:

function fn(x,y){
	console.log(this);
	return x+ y
}
let obj = {
  name:'李云龙'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.call(obj,10,20)// this--->obj , 30

思路:

  1. 为obj添加一个属性,属性值就是fn
  2. 执行那个添加的属性(方法),获取返回值,将返回值返回
  3. 删除我们添加的属性
Function.prototype.myCall = function(context,...params){
	//此时context---->就是obj
	//此时this----->fn
	context.xxx = this //为这个对象添加一个方法
	let result = context.xxx(...params);//执行这个方法,获取返回值
	delete context.xxx;//删除我们添加的那个属性,我们不能改变原本的对象结构
	return result
}
//------------------验证----------------------
function fn(x,y){
	console.log(this.name);
	return x+ y
}
let obj = {
  name:'李云龙'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(obj,10,20)// this--->obj , 30

进一步完善

  • 我们添加的属性,如果和原本的对象的属性一样,那么就会发生改变原来的属性,这是不允许的
  • 对context进行处理,如果是null,那么就是window,
  • 如果context是基本类型值,那么需要将基本类型值转化为对应的引用类型值
  • new context.constructor(),时一般都可以,但是如果context时Symbol类型,那么就会报错,它不允许被new
Function.prototype.myCall = function(context,...params){
    //context ---> 一个对象,我们需要改变的this为context
    //this---->就是那个函数
    context == null ? context = window : null
    //如果传入的是一个null或者是undefined那么,context就是window,否则什么都不做
    !/^(object|function)$/.test(typeof context)?context = Object(context):null
    let key = Symbol('key');
    context[key] = this;
    //这个是为context添加一个属性,属性值为一个函数(this就是一个函数)
    let result = context[key](...params);
    //我们执行context这个对象中的一个方法,就是执行了 this这个函数,并且获得函数执行的返回值
    delete context[key];
    //最后删除一个我们添加的那个属性
    return result
    //那么我就需要返回这个函数执行的结果
    
    
}
//-----------------验证--------------------
function fn(x,y){
	console.log(this.name);
	return x+ y
}
let obj = {
  name:'李云龙'
}
//1.普通使用
fn(10,20) // this---->window,30
//2.使用call
fn.myCall(20,10,20)//传入的是一个基本类型的值 this--->20 , 30


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值