ใ“ใฎใƒšใƒผใ‚ธใฏใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใฎๅฐฝๅŠ›ใง่‹ฑ่ชžใ‹ใ‚‰็ฟป่จณใ•ใ‚Œใพใ—ใŸใ€‚MDN Web Docs ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใƒผใซใคใ„ใฆใ‚‚ใฃใจ็Ÿฅใ‚Šใ€ไปฒ้–“ใซใชใ‚‹ใซใฏใ“ใกใ‚‰ใ‹ใ‚‰ใ€‚

View in English Always switch to English

Function.prototype.call()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2015ๅนด7ๆœˆโฉ.

call() ใฏ Function ใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใฎใƒกใ‚ฝใƒƒใƒ‰ใงใ€ this ใฎๅ€คใจใ€็‹ฌ็ซ‹ใ—ใฆๆไพ›ใ•ใ‚ŒใŸๅผ•ๆ•ฐใซใ‚ˆใฃใฆ้–ขๆ•ฐใ‚’ๅ‘ผใณๅ‡บใ—ใพใ™ใ€‚

่ฉฆใ—ใฆใฟใพใ—ใ‚‡ใ†

function Product(name, price) {
  this.name = name;
  this.price = price;
}

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

console.log(new Food("cheese", 5).name);
// ๆœŸๅพ…ใ•ใ‚Œใ‚‹ๅ‡บๅŠ›็ตๆžœ: "cheese"

ๆง‹ๆ–‡

js
call(thisArg)
call(thisArg, arg1)
call(thisArg, arg1, arg2)
call(thisArg, arg1, arg2, /* โ€ฆ, */ argN)

ๅผ•ๆ•ฐ

thisArg

func ใŒๅ‘ผใณๅ‡บใ•ใ‚ŒใŸใจใใซ this ใจใ—ใฆไฝฟ็”จใ•ใ‚Œใ‚‹ๅ€คใงใ™ใ€‚้–ขๆ•ฐใŒๅŽณๆ ผใƒขใƒผใƒ‰ใงใชใ„ๅ ดๅˆใ€null ใจ undefined ใฏใ‚ฐใƒญใƒผใƒใƒซใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซ็ฝฎใๆ›ใ‚ใ‚Šใ€ใƒ—ใƒชใƒŸใƒ†ใ‚ฃใƒ–ๅ€คใฏใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซๅค‰ๆ›ใ•ใ‚Œใพใ™ใ€‚

arg1, โ€ฆ, argN ็œ็•ฅๅฏ

ๅ‘ผใณๅ‡บใ—ๅ…ˆใฎ้–ขๆ•ฐใซๆธกใ•ใ‚Œใ‚‹ๅผ•ๆ•ฐใงใ™ใ€‚

่ฟ”ๅ€ค

this ใฎๅ€คใจๅผ•ๆ•ฐใ‚’ๆŒ‡ๅฎšใ—ใฆ้–ขๆ•ฐใ‚’ๅ‘ผใณๅ‡บใ—ใŸ็ตๆžœใงใ™ใ€‚

่งฃ่ชฌ

ใƒกใƒข: ใ“ใฎ้–ขๆ•ฐใฏใปใผ apply() ใจๅŒ็ญ‰ใงใ™ใŒใ€ call() ใงใฏ้–ขๆ•ฐใฎๅผ•ๆ•ฐใŒใƒชใ‚นใƒˆใจใ—ใฆๅ€‹ๅˆฅใซๆธกใ•ใ‚Œใ‚‹ใฎใซๅฏพใ—ใ€ apply() ใงใฏ 1 ใคใฎใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ€้€šๅธธใฏ้…ๅˆ—ใซใพใจใ‚ใ‚‰ใ‚Œใพใ™ใ€‚ไพ‹ใˆใฐใ€ func.call(this, "eat", "bananas") ใจ func.apply(this, ["eat", "bananas"]) ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

้€šๅธธใ€้–ขๆ•ฐใ‚’ๅ‘ผใณๅ‡บใ™ๅ ดๅˆใ€้–ขๆ•ฐๅ†…ใฎ this ใฎๅ€คใฏใ€ใใฎ้–ขๆ•ฐใŒใ‚ขใ‚ฏใ‚ปใ‚นใ•ใ‚ŒใŸใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚ call() ใ‚’ไฝฟ็”จใ™ใ‚‹ใจใ€ๆ—ขๅญ˜ใฎ้–ขๆ•ฐใ‚’ๅ‘ผใณๅ‡บใ™้š›ใซใ€ๆœ€ๅˆใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใจใ—ใฆใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซใใฎ้–ขๆ•ฐใ‚’ๆทปไป˜ใ™ใ‚‹ใ“ใจใชใใ€ this ใซไปปๆ„ใฎๅ€คใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใ‚ใ‚‹ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๆฑŽ็”จใฎใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ้–ขๆ•ฐใจใ—ใฆไฝฟ็”จใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

่ญฆๅ‘Š: ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใƒผใ‚’้€ฃ็ตใ™ใ‚‹๏ผˆไพ‹ใˆใฐใ€็ถ™ๆ‰ฟใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹๏ผ‰ใŸใ‚ใซ call() ใ‚’ไฝฟ็”จใ—ใชใ„ใงใใ ใ•ใ„ใ€‚ใ“ใ‚Œใฏใ€ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใƒผ้–ขๆ•ฐใ‚’ๅ˜ใชใ‚‹้–ขๆ•ฐใจใ—ใฆๅ‘ผใณๅ‡บใ™ใ“ใจใซใชใ‚Šใ€ใคใพใ‚Š new.target ใŒ undefined ใจใชใ‚Šใ€ใ‚ฏใƒฉใ‚นใŒใ‚จใƒฉใƒผใ‚’็™บ็”Ÿใ—ใพใ™ใ€‚ใ“ใ‚Œใฏใ€ new ใชใ—ใงๅ‘ผใณๅ‡บใ•ใ‚Œใ‚‹ใŸใ‚ใงใ™ใ€‚ไปฃใ‚ใ‚Šใซ Reflect.construct() ใพใŸใฏ extends ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„ใ€‚

ไพ‹

call ใ‚’ไฝฟ็”จใ—ใŸ้–ขๆ•ฐใ‚’ๅ‘ผใณๅ‡บใ—ใจ 'this' ใฎใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใฎๆŒ‡ๅฎš

ๆฌกใฎไพ‹ใงใฏใ€ greet ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใถใจใใ€this ใฎๅ€คใ‚’ obj ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซใƒใ‚คใƒณใƒ‰ใ—ใฆใ„ใพใ™ใ€‚

js
function greet() {
  console.log(this.animal, "typically sleep between", this.sleepDuration);
}

const obj = {
  animal: "cats",
  sleepDuration: "12 and 16 hours",
};

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

call() ใ‚’ไฝฟ็”จใ—ใŸๆœ€ๅˆใฎๅผ•ๆ•ฐใ‚’ๆŒ‡ๅฎšใ—ใชใ„้–ขๆ•ฐใฎๅ‘ผใณๅ‡บใ—

ๆœ€ๅˆใฎ thisArg ๅผ•ๆ•ฐใ‚’็œ็•ฅใ™ใ‚‹ใจใ€ๆ—ขๅฎšใงใฏ undefined ใจใชใ‚Šใพใ™ใ€‚ ๅŽณๆ ผใƒขใƒผใƒ‰ไปฅๅค–ใงใฏใ€ this ใฎๅ€คใฏ globalThis ๏ผˆใ‚ฐใƒญใƒผใƒใƒซใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซ้กžไผผ๏ผ‰ใซ็ฝฎใๆ›ใˆใ‚‰ใ‚Œใพใ™ใ€‚

js
globalThis.globProp = "foo";

function display() {
  console.log(`globProp ใฎๅ€คใฏ ${this.globProp}`);
}

display.call(); // "globProp ใฎๅ€คใฏ foo" ใจๅ‡บๅŠ›

ๅŽณๆ ผใƒขใƒผใƒ‰ใงใฏ this ใฎๅ€คใฏ undefined ใซใชใ‚Šใพใ™ใ€‚ไปฅไธ‹ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„ใ€‚

js
"use strict";

globalThis.globProp = "foo";

function display() {
  console.log(`globProp ใฎๅ€คใฏ ${this.globProp}`);
}

display.call(); // undefined ใฎ 'sData' ใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใฏ่ชญใ‚ใชใ„

ใƒกใ‚ฝใƒƒใƒ‰ใฎใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ้–ขๆ•ฐใธใฎๅค‰ๆ›

call() ใฏ้€šๅธธใฎ้–ขๆ•ฐๅ‘ผใณๅ‡บใ—ใจใปใผๅŒๆง˜ใงใ™ใŒใ€ this ใŒ้–ขๆ•ฐใฎใ‚ขใ‚ฏใ‚ปใ‚นๅ…ƒใฎๅ€คใงใฏใชใใ€้€šๅธธใฎๅผ•ๆ•ฐใจใ—ใฆๆธกใ•ใ‚Œใ‚‹็‚นใŒ็•ฐใชใ‚Šใพใ™ใ€‚ใ“ใ‚Œใฏใ€ๆฑŽ็”จใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ้–ขๆ•ฐใŒใฉใฎใ‚ˆใ†ใซๅ‹•ไฝœใ™ใ‚‹ใฎใ‹ใจไผผใฆใ„ใพใ™ใ€‚ array.map(callback) ใ‚’ๅ‘ผใถไปฃใ‚ใ‚Šใซใ€ map(array, callback) ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใงใ€ Object.prototype ใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใชใใ€้…ๅˆ—ใงใฏใชใ„้…ๅˆ—้ขจใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆ๏ผˆไพ‹ใˆใฐ arguments๏ผ‰ใซๅฏพใ—ใฆ map ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

ไพ‹ใˆใฐใ€้…ๅˆ—้ขจใฎใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๅฎŸ้š›ใฎ้…ๅˆ—ใซๅค‰ๆ›ใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ™ใ‚‹ Array.prototype.slice() ใ‚’ไพ‹ใซๆŒ™ใ’ใพใ™ใ€‚ ใ“ใฎไพ‹ใงใฏใ€ๆฌกใฎใ‚ˆใ†ใชใ‚ทใƒงใƒผใƒˆใ‚ซใƒƒใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚

js
const slice = Array.prototype.slice;

// ...

slice.call(arguments);

ใชใŠใ€ slice.call ใ‚’ไฟๅญ˜ใ—ใฆใ€ใใ‚Œใ‚’ๅ˜ใชใ‚‹้–ขๆ•ฐใจใ—ใฆๅไป˜ใ‘ใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚ call() ใƒกใ‚ฝใƒƒใƒ‰ใ‚‚ใ“ใฎๅ€คใ‚’่ชญใฟๅ–ใ‚‹ใŸใ‚ใ€ๅ‘ผใณๅ‡บใ™ในใ้–ขๆ•ฐใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ—ใพใ†ใ‹ใ‚‰ใงใ™ใ€‚ใ“ใฎๅ ดๅˆใ€ bind() ใ‚’ไฝฟ็”จใ™ใ‚‹ใจ this ๅ€คใ‚’ call() ใซใƒใ‚คใƒณใƒ‰ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ๆฌกใฎใ‚ณใƒผใƒ‰ใงใฏใ€ slice() ใฏ Function.prototype.call() ใฎใƒใ‚คใƒณใƒ‰ๆธˆใฟใƒใƒผใ‚ธใƒงใƒณใงใ‚ใ‚Šใ€ this ๅ€คใฏ Array.prototype.slice() ใซใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใคใพใ‚Šใ€่ฟฝๅŠ ใฎ call() ๅ‘ผใณๅ‡บใ—ใ‚’็œ็•ฅใงใใ‚‹ใจใ„ใ†ใ“ใจใงใ™ใ€‚

js
// ๅ‰ใฎไพ‹ใฎ "slice" ใจๅŒใ˜
const unboundSlice = Array.prototype.slice;
const slice = Function.prototype.call.bind(unboundSlice);

// ...

slice(arguments);

ไป•ๆง˜ๆ›ธ

Specification
ECMAScriptยฎ 2026 Language Specification
# sec-function.prototype.call

ใƒ–ใƒฉใ‚ฆใ‚ถใƒผใฎไบ’ๆ›ๆ€ง

้–ข้€ฃๆƒ…ๅ ฑ