手撕源码系列(call方法)

132 阅读1分钟

手写属于自己的call方法

  • 源码
	Function.prototype.My_call = function My_call(context, ...params) {
		context = context = null ? window : context;
		let contextType = typeof context;
		if(!/^(object|function)$/i.test(contextType)){
			context = Object(context);
		}
		let result,key = Symbol('KEY');
		context['key'] = this;
		result = context['key'](...params);
		delete context['key'];
		return result;
	}
	
	function add (x,y){
		console.log(this,x+y)
	};
	var obj ={
		name : '帅狒狒'
	};
	var a =1;
	add.My_call(obj,1,2);
  • 详解
	Function.prototype.My_call = function My_call(context, ...params) {
	`//context -> 更改指向后,this想要指向的`
	`//...params ->参数
	//this ->  在没有更改指向前,指向的是要执行的函数`
		context = context = null ? window : context;
		let contextType = typeof context;
		if(!/^(object|function)$/i.test(contextType)){
			context = Object(context);
		}
	`//判断context是不是对象,不是的话。就改变成对象。`
		let result,key = Symbol('KEY');
	`//symbol是具有唯一值的`
		context['key'] = this;
	`//给context增加属性值,属性值是你想要指向的程序。
	//利用 成员属性访问的方法来改变this的指向。`
		result = context['key'](...params);
	`//执行函数`
		delete context['key'];
	`//函数执行完之后,就删去这个属性值。`
		return result;
	`//call的返回值为 执行后的结果`
	}