apply 与 call 细致深切明白

apply 与 call 引见

function f1(x, y) {
    console.log("效果是:" + (x + y) + this);
}
f1(10, 20); //函数的挪用
// 效果是:30[object Window]

// 此时的 f1 实际上是看成对象来运用的,对象能够挪用要领
f1.apply();  // 效果是:NaN[object Window]
f1.call();   // 效果是:NaN[object Window]

f1.apply(null);  // 效果是:NaN[object Window]
f1.call(null);  // 效果是:NaN[object Window]
  • applycall 要领中假如没有传入参数,或许传入的是null,那末挪用该要领的函数对象中的 this 就是默许的 window
  • applycall 都能够让函数或许要领来挪用,传入参数和函数本身挪用的写法不一样,然则效果是一样的。
f1.call(null,10,20);  // 效果是:30[object Window]
f1.apply(null,[10,20]);  // 效果是:30[object Window]
  • 基础运用
function f2(x, y ){
    console.log("效果:"+(x+y)+"  "+ this.age );
}
window.f2(10, 20);  //效果:30  undefined
// obj是一个对象
var obj = {
    age: 10,
    sex: "男"
};
window.f2.apply(obj,[10, 20]);  //效果:30  10
window.f2.call(obj,10,20);  //效果:30  10
console.dir(obj);  // age: 10 sex: "男"

applycall的作用:转变this的指向

apply
call能够转变
this 的指向

例子1:用于要领

function Person(age, sex){
    this.age = age;
    this.sex = sex;
}
//经由过程原型增加要领
Person.prototype.sayHi=function(){
    console.log("您好呀:"+this.sex);
}
var per = new Person(10,"男");
per.sayHi(); // 您好呀:男

function Student(name, sex){
    this.name = name;
    this.sex = sex;
}
var stu=new Student("小明", "女");
per.sayHi.apply(stu); // 您好呀:女
per.sayHi.call(stu);  // 您好呀:女
// stu 没有 sayHi(),然则经由过程apply或call能够让它挪用per的sayHi().

例子2:用于函数

function f(x, y){
    console.log("效果是:"+(x+y)+"  "+this);
    return "此时的this是"+this;
}
// apply和call挪用
var r1=f.apply(null,[1,2]); // 此时f中的this是window
console.log(r1);
//效果是:3  [object Window]
// 此时的this是[object Window]
var r2=f.call(null,1,2); // 此时f中的this是window
console.log(r2);
 //效果是:3  [object Window]
// 此时的this是[object Window]

// 转变this的指向
var obj={
    sex: "男"
}
// 原本f函数是window对象的,然则传入obj以后,f函数就是obj对象的
var r3=f.apply(obj,[1,2]); // 此时f中的this是obj
console.log(r3);
// 效果是:3  [object Object]
// 此时的this是[object Object]
var r4=f.call(obj,1,2); // 此时f中的this是obj
console.log(r4);
// 效果是:3  [object Object]
// 此时的this是[object Object]

applycall的运用要领总结

apply的运用要领:

函数名字.apply(对象,[参数1,参数2,...]);
要领名字.apply(对象,[参数1,参数2,...]);

call的运用要领:

函数名字.call(对象,参数1,参数2,...);
要领名字.call(对象,参数1,参数2,...);

applycall的差别:

  • 参数通报的体式格局是不一样的

运用场景

只如果想运用别的对象的要领,而且愿望这个要领是当前对象的,那末就能够运用
apply或许是
call的要领转变
this的指向。

  • applycall要领实际上并不在函数这个实例对象中,而是在Functionprototye中。
    原文作者:MandyShen
    原文地址: https://segmentfault.com/a/1190000019019752
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞