JavaScriptのcall関数の詳細な使い方

33562 ワード

call() 方法は、指定されたthis値と、それぞれ提供されるパラメータ(パラメータのリスト)とを有する関数を呼び出す.
注意:この方法の役割と  apply() 方法は同様であり、call()方法によって許容されるのはいくつかのパラメータのリストであり、apply()方法によって許容されるのは複数のパラメータを含む配列である.
構文
fun.call(thisArg, arg1, arg2, ...)
パラメータthisArgはい、fun関数運転時に指定されたthis
.注意したいのは、指定されたthis値は必ずしもこの関数が実行された時のものではない.this値は、この関数が非厳密モードである場合には、nullundefinedthis値は自動的にグローバルオブジェクト(ブラウザではwindowオブジェクト)を指し、同時に元の値(数字、文字列、ブール値)のthisは、元の値の自動包装オブジェクトを指す.arg1, arg2, ...指定されたパラメータのリストです.
戻り値
戻り値は、あなたが呼び出した方法の戻り値であり、この方法に戻り値がない場合はundefinedに戻る.
説明
コール中のオブジェクトに、現在のオブジェクトが所有する機能を呼び出しても良いです.callを使って相続を実現できます.次の方法を書いて、他の新しいオブジェクトに引き継がせます.
call方法を使用して父コンストラクタを呼び出します.
1つのサブコンストラクタでは、callに記載されているように、父コンストラクタのJava方法を呼び出すことによって継承を実現することができます.次の例では、FoodおよびToyを用いて作成されたオブジェクト例は、Productのコンストラクタに追加されたname属性およびprice属性を有するが、category属性は、それぞれのコンストラクタに定義されている.
function Product(name, price) {
  this.name = name;
  this.price = price;

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

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

//   
function Food(name, price) {
  this.name = name;
  this.price = price;
  if (price < 0) {
    throw RangeError(
      'Cannot create product ' + this.name + ' with a negative price'
    );
  }

  this.category = 'food';
}

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

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
call方法を使用して匿名関数を呼び出します.
次の例のfor循環体内では、匿名関数を作成し、次いで、各配列要素を指定されたcall値としてその匿名関数を起動するthis方法によって実行した.この匿名関数の主な目的は、各配列要素オブジェクトにprint方法を追加することであり、このprint方法は、各要素の配列内の正しいインデックス番号を印刷することができる.もちろん、ここでは、this値として配列要素をその匿名関数(通常のパラメータであれば良い)に導入する必要がありません.目的はcallの使用法を実証するためです.
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); 
    } 
    this.print();
  }).call(animals[i], i);
}
call方法を使用して関数を呼び出し、コンテキストの「this」を指定します.
以下の例では、greet方法を呼び出すと、この方法のthis値はiオブジェクトに結び付けられる.
function greet() {
  var reply = [this.person, 'Is An Awesome', this.role].join(' ');
  console.log(reply);
}

var i = {
  person: 'Douglas Crockford', role: 'Javascript Developer'
};

greet.call(i); // Douglas Crockford Is An Awesome Javascript Developer