题解 | #_call函数#

_call函数

https://www.nowcoder.com/practice/22df1ed71b204a46b00587fdb780b3ab

// 使用原型链,将_call存在Function.prototype中,这样所有函数调用时都可以使用到_call
Function.prototype._call = function(context, ...args)
{
	// context可能传入的是null,call的实现中会使得context = globalThis
	// JS中的二元运算符||会返回第一个为真值的变量
	context = context || globalThis;
	/*
	我们需要先明白,这里的this到底是什么,那么谁调用了_call,谁就是this
	所以this就是调用_call的函数
	首先需要明确,我们无法直接使用this(...args),因为这样并没有办法改变
	调用_call的函数内部this的指向
	此时可以想到,如果我们调用对象的方法,那么这个方法的this是指向对象的
	所以我们可以将调用_call的函数作为context的一个属性
	然后再调用它,那么就解决了其内部this指向context的问题。
	我们之所以大费周章地使用Symbol,是因为我们需要一个和context中任意属性都不重名的属性
	Symbol是唯一的。
	然后对于这样的一个调用_call的函数,我们可能有返回值,所以必须用变量收集起来。
	最后我们从context中删去我们的临时属性。
	
	PS:
	如果是一个Symbol类型作为对象的属性的话,只能使用[]来调用和修改它
	*/
	const key = Symbol();
	context[key] = this;
	const ret = context[key](...args);
	delete context[key];
	return ret;
};

全部评论
✌️
点赞 回复 分享
发布于 2024-06-03 19:32 河北

相关推荐

不愿透露姓名的神秘牛友
2024-12-26 09:23
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务