在此之前就已经熟悉了javascript的call和apply的区别,但是在实际的项目中又很少用到,以至于对这对双胞胎的辨识度直线下降。古人有云:熟能生巧!还是要多运用才能记得牢啊。

用法

先来看看栗子:

1
2
obj.call(thisObj, arg1, arg2, ...);
obj.apply(thisObj, [arg1, arg2, ...]);

不难看出call和apply其实是同一个东西,都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向,区别只有参数不同。

栗子

假设有一男一女,女的能开口说话say,男的是哑巴,而且男女都有自己的名字name。如果这个时候有第三个人来了,哑巴男想对第三者进行介绍,因为不会说话,只能借女的之口来表达。那么code就可以这样码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let human = function () {
this.name = 'human';
};
human.prototype.say = function (something) {
console.log('my name is ' + this.name);
console.log(something);
};

let woman = new human();
woman.name = 'Han meimei';

let man = {name: 'Li lei'};
woman.say.call(man, 'I like u');
// or
woman.say.apply(man, ['I like u']);

嗯,就是这样的。