手写call,apply,bind

1.call函数的实现

// 首先我们需要给所有的函数添加一个自定义的call方法
Function.prototype.newCall(thisArg,...args){
	// 1.现在我们需要知道是哪一个函数调用了newCall
	var fn = this;
	// 2.对传入的thisArg做限制,只能是对象
	thisArg = thisArg != null && thisArg != undefined ? Object(thisArg):window
	// 3.将参数的this绑定到该函数身上,并调用
	// 利用一下thisArg的fn属性,利用完后没用了就删除掉
	thisArg.fn = fn
	var result = thisArg.fn(...args)
	delete thisArg.fn
	// 4.将最终的结果返回出去
	return result;
}

2.apply函数的实现

// 首先我们需要给所有的函数添加一个自定义的apply方法
Function.prototype.newApply(thisArg,argArray){
	// 1.我们需要知道是哪一个函数调用了newApply
	var fn = this;
	// 2.对传入的thisArg做限制,只能是对象
	thisArg = thisArg != null && thisArg != undefined ? Object(thisArg):window
	// 3.将参数的this绑定到该函数身上并调用
	// 利用一下thisArg的fn属性,利用完后没用了就删除掉
	thisArg.fn = fn
	arrArray = arrArray || []
	var result = thisArg.fn(...argArray)
	delete thisArg.fn
	// 4.将最终的结果返回出去
	return result
}

3.bind函数的实现

function sum(num1,num2,num3,num4){
	console.log(num1,num2,num3,num4)
}
// bind函数传递参数比较特殊 有三种传法
// 第一种
var newSum = sum.bind('aaa',10,20,30,40)
newSum()
// 第二种
var newSum = sum.bind('aaa')
newSum(10,20,30,40)
// 第三种
var newSum = sum.bind('aaa',10,20)
newSum(30,40)

// 所以我们在处理参数的时候需要注意下
// 首先我们需要在所有函数的身上添加自定义的newBind方法
Function.prototype.newBind(thisArg,argArray){
	// 1.判断是哪个函数调用的该方法
	var fn = this
	// 2.对传递的this做限制,必须是对象
		thisArg = thisArg != null && thisArg != undefined ? Object(thisArg):window
	// 3.对传入的参数做处理
	// 然后将参数的this绑定到该函数身上并调用
	// 利用一下thisArg的fn属性,利用完后没用了就删除掉
function proxyFn(...args){
	thisArg.fn = fn
	var finalArgs = [...argArray,...args]
	var result = thisArg.fn(...finalArgs)
	delete finalArgs.fn
	
	4. 返回结果
	return result
}
return proxyFn
}
posted @   w灰二  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示