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() 方法的手写实现!!!