Open sofish opened 8 years ago
对于函数体内,this 总是指向调用它的上下文,有时候我们希望调用的上下文是某个指定的对象,这里最简单的方法是使用用 call 和 apply。每次面试,问到它俩有什么区别,这个非常简单的一个点,面试的时候屡试不爽,大部分人都不知道。
this
call
apply
在此之前,我们先来看一段代码。
class Cat { constructor(name) { this.name = name; } meow() { console.log(`meow, i'm ${this.name}`); } } var fakeCat = { name: 'sofish' }; var ciao = new Cat('ciao'); ciao.meow(); // meow, i'm ciao ciao.meow.call(fakeCat); // meow, i'm sofish ciao.meow.apply(fakeCat); // meow, i'm sofish
同样是 Cat 的实例 —— ciao 在叫(meow),为什么结果不一样?因为第二和三个调用使用 call 把 ciao.meow 的执行上下文改变成 fakeCat,所以 this.name 相当于 fakeCat.name,结果很明显。
Cat
ciao
meow
ciao.meow
fakeCat
this.name
fakeCat.name
上面简单演示了它俩的作用,它俩的使用一样,只是参数不同。
call(context, arg1, arg2...)
apply(context, [arg1, arg2...])
array
a
来个代码片段看看:
function sum(a, b, c) { console.log(a + b + c); } sum.call(null, 1, 2, 3); // 6 sum.apply(null, [1, 2, 3]); // 6
好困,看会电视就睡觉去~
有错别字。 大不分人:大部分人 在些之前:在写之前
对于函数体内,
this
总是指向调用它的上下文,有时候我们希望调用的上下文是某个指定的对象,这里最简单的方法是使用用call
和apply
。每次面试,问到它俩有什么区别,这个非常简单的一个点,面试的时候屡试不爽,大部分人都不知道。在此之前,我们先来看一段代码。
同样是
Cat
的实例 ——ciao
在叫(meow
),为什么结果不一样?因为第二和三个调用使用call
把ciao.meow
的执行上下文改变成fakeCat
,所以this.name
相当于fakeCat.name
,结果很明显。上面简单演示了它俩的作用,它俩的使用一样,只是参数不同。
call(context, arg1, arg2...)
第一个参数是上下文,之后所有参数为调用函数的参数列表apply(context, [arg1, arg2...])
第一个参数与call
一样,之后传入一个数组作为函数的参数列表apply
和array
第一个字母都是a
(如果这样就不会搞混参数了)来个代码片段看看:
好困,看会电视就睡觉去~