call

Did you know that you can read content offline by using one of these tools? If you would like to read offline MDN content in another format, let us know by commenting on Bug 665750.

Dash App

Function.prototype.call( thisArg, arg1, ... ) メソッド

概要

関数内での this キーワードの値を明示的に指定して関数を呼び出します。 call メソッドに渡した引数のうち第 2 引数以降のものが、呼び出し先の関数に引数として渡されます。

NOTE: このメソッドは apply() メソッドに似ていますが、呼び出し先関数に渡す引数の指定方法が異なります。 apply() メソッドは、呼び出し先関数に渡す引数のリストを単一の配列として受けとります。
Method of Function
Implemented in JavaScript 1.3
ECMAScript Edition ECMAScript 3rd Edition

構文

fun.call(thisArg[, arg1[, arg2[, ...]]])

引数

thisArg
呼び出し先関数 fun の中で this パラメータとして使用される値です。 実際にこの値が関数の中で this の値として使用されるとは限りません: もし、関数が non-strict mode のコードで、null か undefined が指定された場合は this の値は global object になります。 また、プリミティブ値はボクシングされます。
arg1, arg2, ...
呼び出し先関数 fun に渡される引数です。

Description

呼び出し先関数の中で this として使われるオブジェクトを指定して関数を呼び出します。

this が何を指すかは、通常、関数の呼び出し形式によって決まります。 例えば obj.testMethod() というメソッド呼び出しの形式で関数を呼び出した場合、この関数の中の this はオブジェクト obj を指します。 あるオブジェクトに属するメソッドを別のオブジェクトのメソッドのように呼び出したい (すなわち、メソッド中の this キーワードの参照先オブジェクトを別のオブジェクトにしたい) とき、call メソッドを使えば、わざわざ別のオブジェクトのプロパティにそのメソッドを代入せずとも済みます。 例えば、obj.testMethod というメソッドを otherObj のメソッドのように呼び出したいときは、obj.testMethod.call( newObj ) とすればよいです。

Examples

コンストラクタを連鎖させるために call メソッドを使用する

コンストラクタを用いてオブジェクトを生成する際に、call を用いることで Java のようにコンストラクタによる初期化を連鎖させることができます。 下の例では、Product コンストラクタは 2 つの引数 name と value をとるように定義されています。 Food と Toy は、call メソッドを使用して Product 内での this の値が自身の中での this の値と同じになるように Product コンストラクタを呼び出しています。 その際、引数として name と value を渡しています。 Product は name プロパティと price プロパティを初期化し、特殊化されたコンストラクタである Food と Toy はどちらも category プロパティを初期化します。

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);

無名関数の呼び出しに call メソッドを使用する

次の例では、無名関数に対して call メソッドを呼び出すことで、この無名関数があたかも配列中のそれぞれのオブジェクトのメソッドであるかのように振舞わせています。 ここで無名関数を使用する主な目的は、無名関数の中でさらに関数オブジェクト (すなわちクロージャ) を生成し、その関数オブジェクトが配列中の正しいインデックス番号を保持するようにすることです。 無名関数の中で生成された関数オブジェクトは、配列中のオブジェクトのメソッドになります。 ここで 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); 
    } 
  }).call(animals[i], i);
}

See Also

apply

タグ (1)