call

246 阅读1分钟

call的用法

call 修改函数内部this指向

call 可以让函数执行,并且可以改变函数执行时内部的this指向,this指向了 call的第一个实参,call后边的所有参数,都被作为实参传给前边的函数

举例说明

function fn() {
        console.log(arguments);
        console.log(this);
    }
var obj = {
    a: 12,
    b: 13,
    f: fn
}
fn(1, 2, 3);
obj.f(3,4,5);
fn.call(obj,6,6,6);

执行结果:

自己实现call

//自己实现一个myCall  用法等同于call
 Function.prototype.myCall = function myCall(context, ...arg) { //剩余运算符 ...
    //this 就是fn
    //this(...arg)//...扩展运算符
    let a = Symbol(); //产生一个唯一不重复的值
    context = context || window;//容错机制 如果context不传参 this默认是window
    context[a] = this;//a是一个变量  所以只能用[]去取值
    let res = context[a](...arg);//让fn执行
    delete context[a];
    return res;
}
fn.myCall(obj, 2, 3, 4, 5);
fn.myCall();