题解 | #_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 河北

相关推荐

字节一直是我的白月光,考虑到转正还是拒了日常实习。
从明天开始狠狠卷JV...:为什么你释放的offer没流到我头上
点赞 评论 收藏
分享
白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
投了多少份简历才上岸
点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
大飞的诡术妖姬:之前看b站多明海有个说法,日本就业竞争非常低的原因不光是毕业学生少,还有很多人干两年不喜欢职场氛围就辞职躺平,位置也空了很多,论吃苦耐劳还得看咱们
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务