apply()和call()以及bind()

apply()和call()以及bind()三者都是用来改变上下文执行,只是传递的参数不一样

Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)apply是将args数组一个一个与Function类中的参数一一对应

 

Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表,Function类的参数一一对应

 

Function.bind(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表,Function类的参数一一对应

bind()并不会立即执行函数,而是返回一个绑定了this的新函数,且新函数的this无法再次被修改,需要手动调用新产生的函数

示例.ts

add(a, b) {
        return this + a + b;
    }
mutilAdd() {
var param1 = 3; var param2 = 4; //将add中的上下文this变成了1 var res1 = this.add.call(1, param1, param2)//res1结果为8 var res2 = this.add.apply(1, [param1, param2])//res2结果为8
var fuc = this.add.apply(1, [param1, param2])//fuc为一个新的函数
var res3 = fuc();//结果为8
    }

示例.js

function ProA(name, skill) {
    this.name = name;
    this.skill = skill;
    this.fn = function () {
        console.log("my name is " + this.name + ", my skills are " + this.skill);
        console.log(this)
    }
}

function ProB(name, skill) {
    console.log(this)
    //此处改动产生的效果为:
    //在ProB内,通过apply,执行,并改动ProA中的执行上下文(this),
    //及修改ProA的参数为ProB所接收的参数
    //那么在new调用ProB时,相当于调用了被修改了执行上下文和参数之后的ProA
    //ProB的this传入ProA后执行this相关的参数函数赋值,由于ProA中的this是ProB的所以ProB就拥有了参数name、skill和函数fn
    ProA.call(this, name, skill)
}
var A = new ProA("AAA", "sing");
A.fn(); //my name is AAA, my skills are sing
var B = new ProB("BBB", "dance");
B.fn();

 

参考:代码

 

posted @ 2023-05-19 15:33  流年sugar  阅读(12)  评论(0编辑  收藏  举报