JavaScript — 手写 call() 方法【最简单的方法!!!】

1、简单介绍 call() 方法的作用

call() 方法主要用于改变函数的 this 指向,同时还会对函数进行调用。

call(thisArg, arg1, arg2, ...) 

大致了解一下 call() 方法的作用,下面就来让我带你一步步的手写代码吧

2、手写 call() 方法

直接上代码【带注释和详细讲解】:

// 手写call ctx--作用域对象 Function是根级函数--function的顶级函数
Function.prototype.myCall = function(ctx) {
    // 作用域对象 不传参数就是window
    ctx = ctx || window
    // 在ctx作用域下新建一个fn,然后将当前函数的this指向这个fn
    ctx.fn = this
    // arguments所有函数内置对象 当不知道要传多少参数时使用即可
    // slice[start,end) 截取数组和字符串 自0开始计算
    // 与之区别的是 splice(index, num, addData...) 删除
    let args = [...arguments].slice(1) // 拿到索引1开始传入的参数
    // 执行绑定的函数 传入参数
    let result = ctx.fn(...args)
    // 将执行结果返回
    return result
}

大致的步骤就是:拿到作用域对象,也就是 this 指向的作用域,然后给作用域对象创建一个函数 fn,将我们绑定的函数的 this 指向这个作用域对象,紧接着使用 arguments 获取后面传入的参数,最后传给绑定的函数执行拿到返回值,将函数执行的结果返回出去,这也就完成了call方法的实现。

测试:

// 测试我们的手写call
var name = 'myName'
var a = {
    name: 'yourName',
    fn: function(x, y) {
        console.log(x+y);
        console.log(this.name);
        // 这里同样用到了闭包:子函数使用父函数变量的行为叫做闭包
    }
}
var b = a.fn
b.myCall(a, 2, 3) // 5 yourName 成功

这样你就完成了 call() 方法的手写实现!!!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG 爆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值