Function.prototype.call()

この翻訳は不完全です。英語から この記事を翻訳 してください。

概要

this の値と、個々にあたえた引数をわたして、関数を呼び出します。

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

構文

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

引数

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

説明

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

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

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

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

関数の呼び出しや'this'を明確にするためにcallメソッドを使用する

次の例では、greedメソッドを呼ぶとき、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

仕様

仕様書 ステータス コメント
ECMAScript 1st Edition (ECMA-262) Standard 初期定義. JavaScript 1.3にて作成.
ECMAScript 5.1 (ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Standard  
ECMAScript 2016 Draft (7th Edition, ECMA-262)
The definition of 'Function.prototype.call' in that specification.
ドラフト  

See Also

apply

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: k-kuwahara, isdh, teoli, siokoshou, ethertank, nobuoka
 最終更新者: k-kuwahara,