call apply

这是个常见的面试题,特别是前端面试前端

不少人不经常使用这两个方法,因此也很难说清楚它们的区别。面试

其实,理解这两个方法也许确实不容易,可是单纯回答这个问题却很容易数组

只要搜一下就能够知道:浏览器

这两个方法惟一的区别,就是app

call接收的参数是用逗号分割的多个参数jsp

apply接收的参数是一个数组函数

如,this

theFunction.call(valueForThis, arg1, arg2, ...)spa

theFunction.apply(valueForThis, arrayOfArgs)prototype

 而后,还有一个区别,那就是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

相关文章
相关标签/搜索