在学习JS函数时,apply和call这里不是很明白,查了几个帖子总结了一下,做了如下笔记。
以下主要介绍这三个问题:
1.apply和call方法的作用是什么?
2.apply和call有什么区别?
3.apply和call分别在什么情况下使用?
0.apply和call方法的定义
apply():方法能劫持另外一个对象的方法,继承另外一个对象的属性.
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function
call():和apply的意思一样,只不过是参数列表不一样.
看一个apply的例子:
<script>
function Person(name,age){
this.name = name;
this.age = age;
}
function Student(name,age,grade){
Person.apply(this,arguments);
this.grade = grade;
}
var student = new Student("zll",12,"Grade6");
alert(student.name+","+student.age+","+student.grade);//结果为zll,12,Grade6
</script>
结果为:zll,12,Grade6
Student类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处
分析:
Person.apply(this,arguments);
this:在创建对象时代表的是student
arguments:是一个数组,也就是[“zll”,”12”,”Grade6”];
通俗一点讲就是:
用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等语句,这样就将属性创建到了student对象里面 。
当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。
1.apply和call方法的作用
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。
关于“改变函数体内部 this 的指向”,来看以下代码:
<script>
function add(a, b){
console.dir(this);
}
function sub(a, b){
console.dir(this);
}
add(1,2);//"Window"
sub(1,2);//"Window"
add.apply(sub, [1, 2]);//"sub(a, b)"
sub.apply(add, [1, 2]);//"add(a, b)"
</script>
二者的作用完全一样,只是接受参数的方式不太一样。
apply()方法接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组。参数数组可以是Array的实例或是arguments对象。
对于call()方法而言,第一个参数this值没有变化,传递给函数的参数必须逐个列举出来。
看下面代码:
function sum(num1,num2){
return num1 + num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);//参数为arguments对象
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);//参数[num1,num2]为Array的实例
}
function callSum3(num1,num2){
return sum.call(this,num1,num2);//参数num1,num2逐个列举出来
}
3.apply和call分别在什么情况下使用?
使用apply()还是call(),完全取决于给函数传递参数的方式。参数是明确知道数量时,用 call(),而不确定的时候,用 apply()。
本文参考:Js高级程序设计
博客:http://blog.youkuaiyun.com/business122/article/details/8000676
知乎赵望野和杨佰的回答:https://www.zhihu.com/question/20289071