# Call / Apply

이미 정의된 함수를 호출할 때 다른 this객체를 할당. 한번 작성한 함수를 다른 객체에 상속시킴으로써 새로운 객체에서 똑같은 함수를 재작성할 필요가 없다.

object.foo(인자들,..,...) 과 foo.call(object,인자들,..,...) 두개는 서로 완전히 일치합니다.

##객체의 생성자 호출 위해

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0)
    throw RangeError('Cannot create product "' + name + '" with a negative price');
  return this;
}

function Food(name, price) {
  Product.call(this, name, price);
  this.category = 'food';
}
Food.prototype = new Product();

function Toy(name, price) {
  Product.call(this, name, price);
  this.category = 'toy';
}
Toy.prototype = new Product();

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

##익명 함수 호출 위해

var animals = [
  {species: 'Lion', name: 'King'},
  {species: 'Whale', name: 'Fail'}
];

for (var i = 0; i < animals.length; i++) {
  (function (i) { 
    this.print = function () { 
      console.log('#' + i  + ' ' + this.species + ': ' + this.name); 
    } 
  }).call(animals[i], i);
}

##reference https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/call