JavaScript中的call()和apply()
昨天刚做了阿里的前端在线笔试题,其中有一道填空题如下
function func(){ alert(this.valueOf()); } func._________; //期望结果是abc
一开始看到这个题,就想到了call()和apply()方法,但无奈对这两个方法的的用法只是有个模糊的记忆。
于是,就针对这道题,自己对call()和apply()的用法进行了进一步的资料查阅和理解,在此记录一下以便加深印象,也便于以后查找。
作用:
在特定的作用域中调用函数。也就是设置函数体内this对象的值。
用法:
call()和apply()都接受两个参数:一个是在其中运行函数的作用域,另一个是传递的参数。
两者的主要区别在于:接收参数的方式不同。其中call()在接收参数时,参数必须一一列出;而apply()接收的参数必须是参数数组,可以是Array的实例,也可以是arguments对象。例如:
function sum(num1,num2){ return num1+num2; } function applySum1(num1,num2){ return sum.apply(this,arguments); //传入arguments对象 } function applySum2(num1,num2){ return sum.apply(this,[num1,num2]); //传入数组 } function callSum(num1,num2){ return sum.call(this,num1,num2); //传入参数一一列出 }
至于是使用call()还是apply(),完全取决于你采取哪种给函数传递参数的方式最方便。
所以一开始提到的填空题的答案也不唯一,这里就给出以下两种:
func.call("abc");
func.apply("abc");