function å¼
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æ.
function ãã¼ã¯ã¼ãã¯ãå¼ã®ä¸ã§é¢æ°ãå®ç¾©ããããã«ä½¿ç¨ããã¾ãã
function 颿°å®£è¨ãã¢ãã¼æ§æãç¨ãã¦é¢æ°ãå®ç¾©ãããã¨ãã§ãã¾ãã
試ãã¦ã¿ã¾ããã
const getRectArea = function (width, height) {
return width * height;
};
console.log(getRectArea(3, 4));
// äºæ³ãããçµæ: 12
æ§æ
function (param0) {
statements
}
function (param0, param1) {
statements
}
function (param0, param1, /* â¦, */ paramN) {
statements
}
function name(param0) {
statements
}
function name(param0, param1) {
statements
}
function name(param0, param1, /* â¦, */ paramN) {
statements
}
ã¡ã¢:
弿ã¯ãã¼ã¯ã¼ã function ããå§ãããã¨ãã§ãã¾ããã function 宣è¨ã¨ã®ææ§ãããããããã§ãã function ãã¼ã¯ã¼ãã¯æãåãå
¥ãããã¨ãã§ããªãæèã§ç¾ããæã ãå¼ãéå§ãã¾ãã
弿°
nameçç¥å¯-
颿°åãçç¥å¯è½ã§ããã®å ´åã¯é¢æ°ã¯ç¡åã«ãªãã¾ãã name ã¯é¢æ°æ¬ä½ã®ã¿ã®ãã¼ã«ã«ã§ãã
paramNçç¥å¯-
颿°ã®æ£å¼ãªå¼æ°ã®ååã弿°ã®æ§æã«ã¤ãã¦ã¯ã颿°ãªãã¡ã¬ã³ã¹ãåç §ãã¦ãã ããã
statementsçç¥å¯-
颿°ã®æ¬ä½ãæ§æããæã§ãã
解説
function å¼ã¯ function 宣è¨ã¨ããä¼¼ã¦ãããã»ã¨ãã©åãæ¸å¼ã§ãã function å¼ã¨ function 宣è¨ã®ä¸»ãªç¸éç¹ã¯ã颿°åã§ãã function å¼ã§ã¯ãç¡å颿°ãçæããããã«ã颿°åãçç¥ã§ãã¾ãã function å¼ã¯ãå®ç¾©ããã¨ããã«å®è¡ãã IIFE ï¼å³æå®è¡é¢æ°ï¼ã¨ãã¦ä½¿ç¨ã§ãã¾ãã詳細ã«ã¤ãã¦ã¯ã颿°ã®ç« ãåç
§ãã¦ãã ããã
颿°å¼ã®å·»ãä¸ã
JavaScript ã®é¢æ°å¼ã¯ã颿°å®£è¨ã¨éã£ã¦å·»ãä¸ãããã¾ãããå®ç¾©åã«é¢æ°å¼ã使ç¨ãããã¨ã¯ã§ãã¾ããã
console.log(notHoisted); // undefined
// 夿°åã¯å·»ãä¸ããè¡ããã¾ãããå®ç¾©ã¯è¡ããã¾ããã
// ãã®ãã undefined ã«ãªãã¾ãã
notHoisted(); // TypeError: notHoisted is not a function
var notHoisted = function () {
console.log("bar");
};
ååä»ã颿°å¼
颿°å
ã§ãã®é¢æ°èªèº«ãåç
§ããå¿
è¦ãããå ´åã¯ãååä»ã颿°å¼ã使ããå¿
è¦ãããã¾ãããã®ååã¯é¢æ°æ¬ä½ï¼ã¹ã³ã¼ãï¼ã«å¯¾ãã¦ãã¼ã«ã«ã§ããããã«ãããå帰å¼ã³åºããè¡ãå ´åã«éæ¨å¥¨ã® arguments.callee ããããã£ã使ç¨ããã«æ¸ã¿ã¾ãã
const math = {
factorial: function factorial(n) {
console.log(n);
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
},
};
math.factorial(3); // 3;2;1;
颿°å¼ã«ååãä»ãããã¦ããå ´åã颿°ã® name ããããã£ã«ã¯ãæ§æããæ¨æ¸¬ãããæé»ã®åå (颿°ãå²ãå½ã¦ããã¦ãã夿°ãªã©) ã§ã¯ãªãããã®ååãè¨å®ããã¾ãã
宣è¨ã¨ã¯ç°ãªãã颿°å¼ã®ååã¯èªã¿åãå°ç¨ã§ãã
"use strict";
function foo() {
foo = 1;
}
foo();
console.log(foo); // 1
(function foo() {
foo = 1; // TypeError: Assignment to constant variable.
})();
ä¾
>ç¡å颿°ã®ä½æ
次ã®ä¾ã§ã¯ãç¡å颿°ãå®ç¾©ãã¦ããã x ã«å²ãå½ã¦ã¾ãã 颿°ã¯å¼æ°ã® 2 ä¹ãè¿ãã¾ãã
const x = function (y) {
return y * y;
};
颿°ãã³ã¼ã«ããã¯ã¨ãã¦ä½¿ç¨
ã³ã¼ã«ããã¯ã¨ãã¦ããé »ç¹ã«ä½¿ããã¾ãã
button.addEventListener("click", function (event) {
console.log("button is clicked!");
});
峿å®è¡é¢æ°å¼ (IIFE) ã®ä½¿ç¨
IIFE ã¯ãåä¸ã®å¼ãè¦æ±ãããå ´æã§ãä»»æã®æ°ã®æãèªåèªèº«ã§å®è¡ï¼å ´åã«ãã£ã¦ã¯å¤ãè¿ãï¼ãä¸è¬çãªãã¿ã¼ã³ã¨ãã¦ä½¿ç¨ããã¦ãã¾ãã IIFE ã®å¤ãã®å¾æ¥ããã®ç¨éã¯ãã¢ã¸ã¥ã¼ã«ããããã¯ã¹ã³ã¼ã宣è¨ã¨ãã£ãæ°ããæ§ææ©è½ã«ãã£ã¦åã£ã¦ä»£ãããã¦ãã¾ãã IIFE èªä½ã¯ç¾å¨ãã¢ãã¼é¢æ°ãä»ãã¦è¨è¿°ããããã¨ãä¸è¬çã§ããããã®èãæ¹ã¯å¤ããã¾ãããä¸è¬çã« IIFE ã¯ããã®ããã«ãªã£ã¦ãã¾ãã
// æ¨æºç㪠IIFE
(function () {
// æâ¦
})();
// 弿°ä»ãã® IIFE
(function (a, b) {
console.log(a + b);
})(1, 2); // 3 ãåºå
// 夿°ãåæåããããã«ä½¿ç¨ããã IIFE
const value = (() => {
const randomValue = Math.random();
if (randomValue > 0.5) {
return "heads";
}
return "tails";
})();
ããã§ã¯ãããã¤ãã®ç¨éãä¾ãæ·»ãã¦ç´¹ä»ãã¾ãã
ã¹ã¯ãªããã³ã¼ãã§ã°ãã¼ãã«åå空éãæ±æãããã¨ãé¿ãã
ãã¹ã¦ã®ã¹ã¯ãªããã®æä¸ä½ã®ã¹ã³ã¼ãã¯å ±æããã¦ãããç°ãªããã¡ã¤ã«ãã夿°ã®é¢æ°ãã°ãã¼ãã«å¤æ°ãå°å ¥ãããå¯è½æ§ããããããååã®ç«¶åãé¿ããã«ã¯ãã°ãã¼ãã«å®£è¨ãããååã®æ°ãå¶éãããã¨ãéè¦ã§ãï¼ããã¯ã¢ã¸ã¥ã¼ã«ã§ã¯å¤§å¹ ã«ç·©åããã¾ãããããã§ã䏿夿°ã®ã¹ã³ã¼ããå¶éãããã¨ã¯ãç¹ã«ãã¡ã¤ã«ãã¨ã¦ãé·ãå ´åã«æçã§ãï¼ãåæåã³ã¼ãã§åå©ç¨ããå¿ è¦ããªãé¨åãããå ´åã IIFE ãã¿ã¼ã³ã使ç¨ãããã¨ãã§ãã¾ãã颿°å®£è¨ã颿°å¼ãããåªãã¦ãããã³ã¼ããããã§ä¸åº¦ã ãå®è¡ããããã¨ãä¿è¨¼ãã¾ãã
// ã¹ã¯ãªããã®æä¸ä½ï¼ã¢ã¸ã¥ã¼ã«ã§ã¯ãªãï¼
var globalVariable = (() => {
// ããããã®åæåã³ã¼ã
let firstVariable = something();
let secondVariable = somethingElse();
return firstVariable + secondVariable;
})();
// firstVariable 㨠secondVariable ã¯é¢æ°æ¬ä½ã®å¤ããã¢ã¯ã»ã¹ã§ããªã
ã¢ã¸ã¥ã¼ã«ãã¿ã¼ã³
ã¾ãã IIFE ã使ç¨ãã¦ãã©ã¤ãã¼ã夿°ããããªãã¯å¤æ°ãã¡ã½ããã使ãããã¨ãã§ãã¾ããã¢ã¸ã¥ã¼ã«ãã¿ã¼ã³ã®ããé«åº¦ãªæ´»ç¨ãã IIFE ã®ãã以å¤ã«ãä½¿ç¨æ¹æ³ã«ã¤ãã¦ã¯ã Addy Osmani èãLearning JavaScript Design Patternsããåç §ãã¦ãã ããã
const makeWithdraw = (balance) =>
((copyBalance) => {
let balance = copyBalance; // ãã®å¤æ°ã¯éå
Ž
const doBadThings = () => {
console.log("ãåã®éã§æªããã¨ããã¦ãã");
};
doBadThings();
return {
withdraw(amount) {
if (balance >= amount) {
balance -= amount;
return balance;
}
return "ãéãè¶³ããªã";
},
};
})(balance);
const firstAccount = makeWithdraw(100); // "ãåã®éã§æªããã¨ããã¦ãã"
console.log(firstAccount.balance); // undefined
console.log(firstAccount.withdraw(20)); // 80
console.log(firstAccount.withdraw(30)); // 50
console.log(firstAccount.doBadThings); // undefined; this method is private
const secondAccount = makeWithdraw(20); // "ãåã®éã§æªããã¨ããã¦ãã"
console.log(secondAccount.withdraw(30)); // "ãéãè¶³ããªã"
console.log(secondAccount.withdraw(20)); // 0
ES6 以åã® var ãã¤ãã for ã«ã¼ã
ãããã¯ã¹ã³ã¼ãã® let ããã³ const 宣è¨ãå°å
¥ããã以åãå¤ãã³ã¼ãã§ã¯æ¬¡ã® ãã㪠IIFE ã®ä½¿ç¨ä¾ãè¦ããã¾ããã var æã§ã¯ãæå®ããã颿°ã¹ã³ã¼ãã¨ã°ãã¼ãã«ã¹ã³ã¼ãã®ã¿ãåå¨ãã¾ãã
ãã¨ãã°ã Button 0 㨠Button 1 ã¨ããããã¹ããæã¤ 2 ã¤ã®ãã¿ã³ã使ããã¯ãªãã¯æã«ãããã 0 㨠1 ãã¢ã©ã¼ã表示ãããã¨ãã¾ãã以ä¸ã®ã³ã¼ãã¯åä½ãã¾ããã
for (var i = 0; i < 2; i++) {
const button = document.createElement("button");
button.innerText = `Button ${i}`;
button.onclick = function () {
console.log(i);
};
document.body.appendChild(button);
}
console.log(i); // 2
ã¯ãªãã¯ããã¨ãButton 0 㨠Button 1 ã®ä¸¡æ¹ã 2 ãéç¥ãã¾ãããã㯠i ãã°ãã¼ãã«å¤æ°ã§ãããæå¾ã®å¤ã 2 ã§ããããã§ããES6 以åã§ã¯ã IIFE ãã¿ã¼ã³ã使ç¨ãã¦ãã®åé¡ãä¿®æ£ãããã¨ãã§ãã¾ããã
for (var i = 0; i < 2; i++) {
const button = document.createElement("button");
button.innerText = `Button ${i}`;
button.onclick = (function (copyOfI) {
return function () {
console.log(copyOfI);
};
})(i);
document.body.appendChild(button);
}
console.log(i); // 2
Button 0 㨠Button 1 ãã¯ãªãã¯ãããã¨ããããã 0 㨠1 ãéç¥ããã¾ãã夿° i ã¯ã°ãã¼ãã«ã«å®ç¾©ããã¦ãã¾ãã let æã使ç¨ããã°ã次ã®ããã«åç´ã«è¨è¿°ã§ãã¾ãã
for (let i = 0; i < 2; i++) {
const button = document.createElement("button");
button.innerText = `Button ${i}`;
button.onclick = function () {
console.log(i);
};
document.body.appendChild(button);
}
console.log(i); // Uncaught ReferenceError: i is not defined.
ã¯ãªãã¯ããã¨ããããã®ãã¿ã³ã¯ 0 㨠1 ãéç¥ãã¾ãã
å¼ã®å ´æã§ã®å¶å¾¡ããã¼æ
IIFE ã«ããã switch ãªã©ã®è¨èªæ§æãå¼å
ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
someObject.property = (() => {
switch (someVariable) {
case 0:
return "zero";
case 1:
return "one";
default:
return "unknown";
}
})();
ããã®ææ³ã¯ã夿°ãconstã«ãããããåæåæã«letãvarã使ç¨ããããå¾ãªãç¶æ³ã§ç¹ã«æçã§ãã
let onlyAssignedOnce;
try {
onlyAssignedOnce = someFunctionThatMightThrow();
} catch (e) {
onlyAssignedOnce = null;
}
IIFE ã使ç¨ãããã¨ã§ã夿°ã const ã«ãããã¨ãã§ãã¾ãã
const onlyAssignedOnce = (() => {
try {
return someFunctionThatMightThrow();
} catch (e) {
return null;
}
})();
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function-definitions> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- 颿°ã¬ã¤ã
- 颿°
functionFunction- ã¢ãã¼é¢æ°