この記事は翻訳作業中です。

call() メソッドは、this の値と、個々にあたえた引数をわたして、関数を呼び出します。

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

構文

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

引数

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

戻り値

this 値と引数を指定して関数を呼び出した結果です。

説明

call() allows for a function/method belonging to one object to be assigned and called for a different object.

call() provides a new value of this to the function/method. With call, you can write a method once and then inherit it in another object, without having to rewrite the method for the new object.

コンストラクタを連鎖させるために 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;
}

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

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 メソッドを使用する

次の例では、無名関数に対して 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); 
    }
    this.print();
  }).call(animals[i], i);
}

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

次の例では、greet メソッドを呼ぶとき、this の値をオブジェクト obj にバインドしています。

function greet() {
  var reply = [this.animal, 'typically sleep between', this.sleepDuration].join(' ');
  console.log(reply);
}

var obj = {
  animal: 'cats', sleepDuration: '12 and 16 hours'
};

greet.call(obj);  // cats typically sleep between 12 and 16 hours

Using call to invoke a function and without specifying the first argument

In the example below, we invoke the display function without passing the first argument. If the first argument is not passed, the value of this is bound to the global object.

var sData = 'Wisen';
            
function display() {
  console.log('sData value is %s ', this.sData);
}

display.call();  // sData value is Wisen 

注: The value of this will be undefined in strict mode. See below.

'use strict';

var sData = 'Wisen';

function display() {
  console.log('sData value is %s ', this.sData);
}

display.call(); // Cannot read the property of 'sData' of undefined

仕様

仕様書 ステータス コメント
ECMAScript 1st Edition (ECMA-262) 標準 初期定義です。JavaScript 1.3 にて作成.
ECMAScript 5.1 (ECMA-262)
Function.prototype.call の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Function.prototype.call の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Function.prototype.call の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 ありOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応

See Also

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

最終更新者: segayuu,