.call 和.apply的区别

对于JavaScript,每个东西都是对象,甚至函数也是对象,每个对象有属性和方法。.apply.call都是函数对象的方法。许多人对这两个函数会感到迷惑。

它们的不同本质上体现在对函数参数的处理上。 两个函数都允许我们控制被调用函数中“this”的含义,不同之处在于参数传递给函数的方式. apply()方法与 call()相同,但 apply()需要第二个参数是数组。 这个数组表示目标方法的参数。

.call()

它用给定的值和单独的参数调用函数。

例子

foo.call(obj, arg1, arg2, arg3)

.apply()

它用给定的值和一个数组或对象数组作为参数,调用函数。

例子

foo.apply(obj, [arg1, arg2, arg3])

第一个参数,两种情况都是对一个对象的引用,在函数内都用'this'表示,call和apply的不同就是如此。两者都作为函数被调用,都在第一个参数的环境中运行。调用的时候以各自的方式传入第一个参数序列,apply将第二个参数按照一个数组进行处理。看下面的例子,会更清晰些。

例子

var StudentName = {
createName: function(firstName, middleName, lastName){
return firstName + ' ' + middleName + ' '+ lastName;
}
};
function displayName(firstName,middleName,lastName){
document.write(this.createName(firstName,middleName,lastName));
}
//comma separated list or arguments
displayName.call(StudentName,'John','Villa','Doe');
//arguments are passed as an array
var nameArr = ['John', 'Villa','Doe'];
displayName.apply(StudentName,nameArr);

输出

John Villa Doe
John Villa Doe
原文链接