手写call,apply,bind方法【前端面试系列】

这篇博客介绍了如何使用JavaScript重写原生的call、apply和bind方法。通过创建一个唯一key并将其与函数绑定到指定上下文中,实现了函数调用的不同方式。同时,确保了当传入null或undefined时,this指向window,并在调用后清理上下文。这些方法在处理函数上下文和参数传递时非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我在这里就不讲解这三个API的用法了,有需要请自行查看MDN文档

call

Function.prototype.myCall = function(context, ...args) {
	if (typeof this !== 'function') {
      	throw new TypeError('Error')
    }
	context = context ?? window // 传进来的是null和undefined时将this指向为window
    context = Object(context) // 确保传进来的是Object
	// 生成一个唯一的key值,防止和传进来的对象的key重复
    const key = Symbol()
    context[key] = this
    const result = context[key](...args)
    delete context[key] // 删除手动添加的属性,使context回到最初的样子
    return result
}

apply

Function.prototype.myApply = function (context, arrs) {
    if (typeof this !== 'function') {
        throw new TypeError('Error')
    }
    context = context ?? window // 传进来的是null和undefined时将this指向为window
    context = Object(context) // 确保传进来的是Object
    // 生成一个唯一的key值,防止和传进来的对象的key重复
    const key = Symbol()
    context[key] = this
    const result = arrs ? context[key](...arrs) : context[key]()
    delete context[key] // 删除手动添加的属性,使context回到最初的样子
    return result
}

bind

Function.prototype.myBind = function(context, ...args1) {
	if (typeof this !== 'function') {
      	throw new TypeError('Error')
    }
    return (...args2) => {
		context = context ?? window // 传进来的是null和undefined时将this指向为window
	    context = Object(context) // 确保传进来的是Object
		// 生成一个唯一的key值,防止和传进来的对象的key重复
	    const key = Symbol()
	    context[key] = this
	    const result = context[key](...args1, ...args2)
	    delete context[key] // 删除手动添加的属性,使context回到最初的样子
	    return result
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值