这是个常见的面试题,特别是前端面试
很多人不常用这两个方法,所以也很难说清楚它们的区别。
其实,理解这两个方法也许确实不容易,但是单纯回答这个问题却很容易
只要搜一下就可以知道:
这两个方法唯一的区别,就是
call接收的参数是用逗号分割的多个参数
apply接收的参数是一个数组
如,
theFunction.call(valueForThis, arg1, arg2, ...)
the
Function.apply(valueForThis, arrayOfArgs)
然后,还有一个区别,那就是call的速度要比apply快一点点
http://jsperf.com/test-call-vs-apply/3
valueForThis是一个基础参数:
在 fun
函数运行时指定的 this
值。
需要注意的是,指定的 this
值并不一定是该函数执行时真正的 this
值,如果这个函数处于非严格模式下,则指定为 null
或 undefined
时会自动指向
全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this
会指向该原始值的自动包装对象。
举个栗子:
function Person(nn){ this.name = nn; this.getName = function(){ return this.name; }; }; var john = new Person('john'); john.getName(); //output john var jack={name : 'jack'}; john.getName.call(jack,null); //output jack
可以这样理解,call方法为jack对象添加了一个getName函数
也可以说,call方法把getName函数内部的this对象指向了jack对象
总结下就是:改变函数的execute context,也就是runtime时this关键字的指向。
还有一种常用方式,是访问原型链上的方法
Array.prototype.slice.apply
详细请看:
http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply