手写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
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了