call apply

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

很多人不常用这两个方法,所以也很难说清楚它们的区别。

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

只要搜一下就可以知道:

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

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

apply接收的参数是一个数组

如,

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

theFunction.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

 

 

原文地址:https://www.cnblogs.com/yyjj/p/3678840.html