.call()

それぞれ個別に指定したthis値と引数によって、関数を呼び出します。

注意: この関数の文法はapply()とほぼ同じです。 根本的な違いは、call()が引数のリストを受け入れるのに対し、apply()は単一の引数の配列のみを受け取るところです。

文法

fun.call(thisArg[, arg1[, arg2[, ...]]])
引数 説明
thisArg fun(関数)の呼び出しに提供されるthis値を指定します。 このメソッドによって参照されるのは実際の値では無いかもしれないことに注意してください。 もし、メソッドが非strictモードのコード内の関数である場合、 nullundefinedはグローバルオブジェクトに置き換えられ、 プリミティブ値はボックス化されます。
arg1, arg2, ... 渡される引数を指定します。

説明

このメソッドにより、既存の関数を呼び出す際に、異なるthisオブジェクトを割り当てることが可能になります。 通常、thisは、呼び出しをしたオブジェクト自体を参照します。

callを使用すると、それを書くだけで、 新しいオブジェクトに対してそのメソッドを書き直す必要無く、 別のオブジェクトを引き継ぐことが可能になります。

callを使用したチェーンコンストラクタ

Javaのように、オブジェクトのチェーンコンストラクタにcallを使用することが可能です。 下記の例では、Productオブジェクトのためのコンストラクタが2つのパラメーター nameprice付きで定義されています。 他の2つの関数、FoodとToyはthisnamepriceを渡すことでProductを実行します。 Productはnamepriceのプロパティを初期化し、 用途に特化した2つの関数は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 = Object.create(Product.prototype);

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

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

callを使用した匿名関数の実行

この例では、匿名関数を作成し、callを使用して、 配列の各オブジェクト毎にその匿名関数を実行しています。 この例での匿名関数を使用する目的は、配列のオブジェクトの情報をコンソール出力することが出来るように、 各オブジェクトに対してprint関数を追加することにあります。 厳密にはオブジェクトにthis値を渡す必要はありませんが、 解説のためにこれを行っています。

//訳注)speciesは"種"を意味します
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);
}

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。