手写call、apply、bind

本文详细介绍了JavaScript中改变函数this指向的三种方法:call、apply和bind。通过实例解析了它们的使用方式及区别,包括call的立即执行、apply的参数数组传递和bind的返回新函数特性。同时,提供了扩展实现wcall和wapply的方法,以及bind2的改进版bind功能。
摘要由CSDN通过智能技术生成

call、apply、bind 都可以改变函数的this指向

  • call 接受多个参数,第一个参数代替执行的this,后面的都是函数传入的参数----会立即执行函数
Function.prototype.wcall = function(content = window){
	// 给原对象增加一个属性,并赋值给被执行的函数
	content.fn = this
	// 拿到除了第一个参数之外后面的参数
	let rest = [...arguments].slice(1)
	// 拿到函数的执行结果
	let result = comntent.fn(rest)
	// 删除创建的属性值,防止影响原对象
	delete content.fn
	return result
}
  • apply 接受两个参数,第一个参数代替执行的this,第二个参数是一个数组----会立即执行函数
Function.prototype.wapply = function(content = window){
	content.fn = this
    let rest = arguments[1] || []
    let result = content.fn(...rest)
    delete context.fn
    return result
}
  • bind接受多个参数,第一个参数代替执行的this,后面的参数是返回函数的接受参数----返回一个函数(且返回函数的原型上会有原函数的属性和方法)
Function.prototype.bind2 = function(content) {
	if(typeof this != "function") {
        throw Error("not a function")
    }
    // 若没问参数类型则从这开始写
    let fn = this;
    let args = [...arguments].slice(1);
    
    let resFn = function() {
        return fn.apply(this instanceof resFn ? this : content,args.concat(...arguments))
    }
    function mid() {}
    mid.prototype = this.prototype
    resFn.prototype = new mid()
    return resFn
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值