sofish / learn-js

老婆想学 js 这件事就是一个政治任务
142 stars 9 forks source link

第四天:`call` vs `apply` #6

Open sofish opened 8 years ago

sofish commented 8 years ago

对于函数体内,this 总是指向调用它的上下文,有时候我们希望调用的上下文是某个指定的对象,这里最简单的方法是使用用 callapply。每次面试,问到它俩有什么区别,这个非常简单的一个点,面试的时候屡试不爽,大部分人都不知道。

在此之前,我们先来看一段代码。

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),为什么结果不一样?因为第二和三个调用使用 callciao.meow 的执行上下文改变成 fakeCat,所以 this.name 相当于 fakeCat.name,结果很明显。

上面简单演示了它俩的作用,它俩的使用一样,只是参数不同。

来个代码片段看看:

function sum(a, b, c) {
  console.log(a + b + c);
} 

sum.call(null, 1, 2, 3); // 6
sum.apply(null, [1, 2, 3]); // 6

好困,看会电视就睡觉去~

wenzhixin commented 8 years ago

有错别字。 大不分人:大部分人 在些之前:在写之前