apply 与 call 详细

栏目: JavaScript · 发布时间: 5年前

内容简介:只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么就可以使用

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 的指向

applycall 可以改变 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 中。

以上所述就是小编给大家介绍的《apply 与 call 详细》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法引论

算法引论

[美]Udi Manber / 黄林鹏、谢瑾奎、陆首博、等 / 电子工业出版社 / 2005-9-1 / 35.00元

本书是国际算法大师乌迪·曼博(Udi Manber)博士撰写的一本享有盛誉的著作。全书共分12章:第1章到第4章为介绍性内容,涉及数学归纳法、算法分析、数据结构等内容;第5章提出了与归纳证明进行类比的算法设计思想;第6章到第9章分别给出了4个领域的算法,如序列和集合的算法、图算法、几何算法、代数和数值算法;第10章涉及归约,也是第11章的序幕,而后者涉及NP完全问题;第12章则介绍了并行算法;最后......一起来看看 《算法引论》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具