js 实现 bind call apply

本文介绍了如何使用JavaScript实现bind、call和apply这三个重要的函数方法。通过具体的代码示例,展示了这些方法的工作原理及其区别,包括如何改变函数的上下文环境以及参数传递方式。

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

js实现 bind call apply

很多面试题上都提到 使用 js 实现 bind call apply, 于是稍微尝试了一下,在此记录一下

bind

对于 Function.prototype.bind 这个方法,就是改变函数的上下文环境,并返回一个新函数,原函数不受影响。先看我实现的代码:

var obj = {
    name: 'dcw'
};

function fn (a, b) {
    console.log(a, b)
    console.log(this.name);
}
Function.prototype.myBind = function (obj) {

    var arg = [...arguments];
    arg.shift();
    var res = this.call(obj, ...arg);
    return function () {
        return res;
    }
}
fn.myBind(obj, 1, 2)()
说明

用了添加内置方法的办法,在这里只是为了方便大家 review ,实际上我不喜欢这种写法,主要是因为难以维护,我更喜欢引入相关模块的方法。在代码里,可以看到,手工实现 bind 的方法就是利用闭包保存使用 call 方法返回的结果,然后在返回的函数中引用即可。当然你也可以使用 apply 方法计算 res,一样。

call 和 apply

call 和 apply 与 bind 的不同在于,它俩会立即执行函数,而 call 和 apply不同的地方在于,call 里面的函数参数是散列的,而 apply 传入的是参数的数组。先看下我实现的代码:

var obj = {
    name: 'dcw'
};

function fn (a, b) {
    console.log(a, b)
    console.log(this.name);
}

Function.prototype.myCall = function (obj) {
    
    var arg = [...arguments];
    arg.shift();
    var tempObj = Object.create(obj);
    tempObj.fn = this;
    tempObj.fn(...arg);
}

Function.prototype.myApply = function (obj) {
    
    var arg = arguments[1];
    var tempObj = Object.create(obj);
    tempObj.fn = this;
    tempObj.fn(...arg);
}
fn.myCall(obj, 1, 2)
fn.myApply(obj, [1, 2])
说明

实现call 和 apply 的办法就是初始化一个对象,该对象可以访问给定对象的所以属性,然后将方法挂载到新建的对象,然后调用新对象中的方法,在此我用了原型链的办法,当然你也可以使用深拷贝的方法复制该对象,然后调用。在这里需要注意的是,注意 arguments 中第一个参数不是我们想要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值