区别
二者的作用都是在指定this
值和参数的情况下调用某个函数,它们 唯一区别 就是参数指定的形式不一样,call接收的是参数列表,apply接收的是数组。
语法:
fn.call(thisArg[, arg1[, arg2[, ...]]]);
fn.apply(thisArg[, argsArray]);
call
和apply
老是分不清,如何记忆呢?可以这样记:apply
比call
单词长,参数也更长:
fn.call(this, a, b);
fn.apply(this, [a, b]);
使用
var obj =
{
str: 'abc',
foo: function(a, b){ console.log(this.str, a, b); }
};
var fn = obj.foo;
obj.foo(1, 2); // 输出abc 1 2
fn(1, 2); // // 输出undefined 1 2,由于是直接执行,this变成了window,所以this.str变成了undefined
fn.call(obj, 1, 2); // 输出abc 1 2
fn.apply(obj, [1, 2]); // 输出abc 1 2