手写call,大白话通俗易懂

133 阅读1分钟
<script>
	// call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
	// 语法:执行fn,使this为obj,并将后面的n个参数传给fn
	// 功能等同于函数对象的call方法
	function add(a,b){
		console.log(this)
		return a+b+this.c
	}
	window.c=10;
	const obj={
		c:20
	}
	function call(fn,obj,...args){
		// 如果上下文对象没有就指向全局对象window
		if(obj===null||obj===undefined){
			obj=globalThis
		}
		//临时增加一个属性,值为要调用的函数,核心代码
		obj.temp=fn
		// 这里的this指向了obj,参数可能是多个,所以用扩展运算符
		const result=obj.temp(...args)
		// 删除临时属性
		delete obj.temp
		// 把值返回出去
		return result
	}
	console.log(add(20,20))
	// 指向obj
	let a=call(add,obj,20,20)

// 指向window let b=call(add,null,20,20) console.log(a) // 总结:通过举例子,可以化抽象为形象,有助于理解.