arguments.callee
鿍奍;: ãã®æ©è½ã¯éæ¨å¥¨ã«ãªãã¾ãããã¾ã 対å¿ãã¦ãããã©ã¦ã¶ã¼ãããããããã¾ãããããã§ã«é¢é£ããã¦ã§ãæ¨æºããåé¤ããã¦ããããåé¤ã®æç¶ãä¸ã§ããããäºææ§ã®ããã ãã«æ®ããã¦ããå¯è½æ§ãããã¾ãã使ç¨ãé¿ããã§ããã°æ¢åã®ã³ã¼ãã¯æ´æ°ãã¦ãã ããããã®ãã¼ã¸ã®ä¸é¨ã«ããäºææ§ä¸è¦§è¡¨ãè¦ã¦å¤æãã¦ãã ããããã®æ©è½ã¯çªç¶åä½ããªããªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã
ã¡ã¢:
峿 ¼ã¢ã¼ãã§ã¯ãarguments.callee ã«ã¢ã¯ã»ã¹ãã㨠TypeError ãçºçãã¾ãã颿°ãèªèº«ãåç
§ããªããã°ãªããªãå ´åã¯ã颿°å¼ã«ååãä»ãããã颿°å®£è¨ã使ç¨ãã¦ãã ããã
arguments.callee ãã¼ã¿ããããã£ã¯ã弿°ãå±ããç¾å¨å®è¡ä¸ã®é¢æ°ãä¿æãã¦ãã¾ãã
å¤
ç¾å¨å®è¡ä¸ã®é¢æ°ã¸ã®åç §ã§ãã
arguments.callee ã®ããããã£å±æ§ | |
|---|---|
| æ¸è¾¼å¯è½ | å¯ |
| åæå¯è½ | ä¸å¯ |
| è¨å®å¯è½ | å¯ |
ã¡ã¢:
callee ã¯ãåç´ãªå¼æ°ãæã¤å³æ ¼ã§ãªã颿°ã«ããã¦ã®ã¿ä½¿ç¨ã§ãããã¼ã¿ããããã£ã§ãï¼ãã®å ´åãarguments ãªãã¸ã§ã¯ããèªååæåããã¾ãï¼ããã以å¤ã®å ´åã¯ãã²ãã¿ã¼ã¨ã»ãã¿ã¼ã®ä¸¡æ¹ã TypeError ãçºçããã¢ã¯ã»ãµã¼ããããã£ã§ãã
解説
callee 㯠arguments ãªãã¸ã§ã¯ãã®ããããã£ã§ããããã¯ãç¾å¨å®è¡ä¸ã®é¢æ°ãããã®é¢æ°æ¬ä½ã®å
é¨ã§åç
§ããããã«ä½¿ç¨ãããã¨ãã§ãã¾ããããã¯ãååã®ãªã颿°å¼ï¼ãç¡å颿°ãã¨ãå¼ã°ããï¼ã®ä¸ãªã©ã颿°åã䏿ãªå ´åã«ä¾¿å©ã§ãã
ï¼Stack Overflow ã® olliej ã«ããåçã«ããã°ï¼
å¤ããã¼ã¸ã§ã³ã® JavaScript ã§ã¯ååä»ãã®é¢æ°å¼ãå©ç¨ã§ããããã®ããå帰ã®é¢æ°å¼ã使ãããã¨ãã§ãã¾ããã§ããã
ä¾ãã°ã以ä¸ã®æ§æã¯åä½ãã¾ããã
function factorial(n) {
return n <= 1 ? 1 : factorial(n - 1) * n;
}
[1, 2, 3, 4, 5].map(factorial);
ãããã
[1, 2, 3, 4, 5].map(function (n) {
return n <= 1 ? 1 : /* ããã§ã©ãããï¼ */ (n - 1) * n;
});
ã¨ã¯æ¸ãã¾ããã§ãããåé¿çã¨ãã¦ãã® arguments.callee ã追å ããã以ä¸ã®ãããªãã¨ãã§ããããã«ãªãã¾ããã
[1, 2, 3, 4, 5].map(function (n) {
return n <= 1 ? 1 : arguments.callee(n - 1) * n;
});
ããããarguments.callee ã®è¨è¨ã«ã¯è¤æ°ã®åé¡ãããã¾ããæåã®åé¡ã¯ãå帰å¼ã³åºãã§ç°ãªã this å¤ãåå¾ããããã¨ã§ããä¾ãã°ã
function sillyFunction(recursed) {
if (this !== globalThis) {
console.log("This is:", this);
} else {
console.log("This is the global");
}
if (!recursed) {
return arguments.callee(true);
}
}
sillyFunction();
// This is the global
// This is: [object Arguments]
ããã«ã arguments.callee ã¸ã®åç
§ã¯ãä¸è¬çãªã±ã¼ã¹ã§ã¯ã¤ã³ã©ã¤ã³åã¨æ«å°¾å帰ãä¸å¯è½ã«ãã¾ããï¼ãã¬ã¼ã¹ãªã©ãéãã¦é¸æã®ã±ã¼ã¹ã§ã¯å®ç¾å¯è½ã§ãããå¿
è¦ã®ãªã調ã¹ãçºçãããããæè¯ã®ã³ã¼ãã§ããæé©ã¨ã¯è¨ãã¾ãããï¼
ECMAScript 3 ã§ã¯ã以ä¸ã®ããã«ååä»ã颿°å¼ã許å¯ãããã¨ã§ãããã®åé¡ã解決ãã¾ããã
[1, 2, 3, 4, 5].map(function factorial(n) {
return n <= 1 ? 1 : factorial(n - 1) * n;
});
ããã«ã¯å¤ãã®å©ç¹ãããã¾ãã
- ä»ã®é¢æ°ã¨åæ§ã«ãã³ã¼ãå ã®ä»ã®ã¨ããããå¼ã³åºããã¨ãã§ãã
- å¤å´ã®ã¹ã³ã¼ãã«å¤æ°ãä½ããªãï¼IE 8 以åãé¤ãï¼
- arguments ãªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ãããããããã©ã¼ãã³ã¹ãè¯ã
峿 ¼ã¢ã¼ãã§ã¯ã颿°ã® caller ããããã£ï¼åæ§ã«ã¹ã¿ãã¯æ
å ±ãæ¼ããï¼ãç¦æ¢ããã¦ãã¾ããããã¯ãå¼ã³åºãã¹ã¿ãã¯ãåç
§ãããã¨ãã夿°ã®æé©åãä¸å¯è½ã«ããããã¯ããã«å°é£ã«ããã¨ããé大ãªå¹æãåã¼ãããã§ããä¾ãã°ã颿° f ãæªç¥ã®é¢æ°ãå¼ã³åºããã¨ãä¿è¨¼ã§ããªãå ´åãf ãã¤ã³ã©ã¤ã³åãããã¨ã¯ã§ãã¾ããã
function f(a, b, c, d, e) {
return a ? b * c : d * e;
}
JavaScript ã¤ã³ã¿ã¼ããªã¿ã¼ã¯ãå¼ã³åºããè¡ãããæç¹ã§æä¾ããããã¹ã¦ã®å¼æ°ãæ°åã§ãããã¨ãä¿è¨¼ã§ããªãå ´åãã¤ã³ã©ã¤ã³åãããã³ã¼ãã®åã§ãã¹ã¦ã®å¼æ°ã®ãã§ãã¯ãæ¿å ¥ãããã颿°ãã¤ã³ã©ã¤ã³åã§ããªãããã«ããå¿ è¦ãããã¾ãããã®å ´åã¯ãè³¢ãã¤ã³ã¿ã¼ããªã¿ã¼ã§ããã°ããã§ãã¯ãããæé©ãªå½¢ã«çµã¿æ¿ãã使ãããªãå¤ã¯ãã§ãã¯ããªãããã«ã§ããã¯ãã§ããããããå¤ãã®å ´åããã¯ä¸å¯è½ã§ããããããã£ã¦ã¤ã³ã©ã¤ã³åãããã¨ã¯ä¸å¯è½ã«ãªãã¾ãã
ä¾
>ç¡åå台颿°å ã§ã® arguments.callee ã®ä½¿ç¨
å台颿°ã¯èªåèªèº«ãåç
§ããå¿
è¦ãããã¾ãããµã¤ãã颿°ãèªåèªèº«ãåç
§ããã«ã¯é¢æ°åã使ç¨ãã¾ããããããç¡å颿°ï¼é¢æ°å¼ã¾ã㯠Function ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ä½æã§ããï¼ã«ã¯ååãããã¾ããããããã£ã¦ããããåç
§ããããã®ã¢ã¯ã»ã¹å¯è½ãªå¤æ°ããªãå ´åã颿°ãèªåèªèº«ãåç
§ã§ããå¯ä¸ã®æ¹æ³ã arguments.callee ã«ããæ¹æ³ã«ãªãã¾ãã
次ã®ä¾ã¯é¢æ°ãå®ç¾©ãããã®é¢æ°å ã§ããã«éä¹é¢æ°ãå®ç¾©ãã¦è¿ãã¦ãã¾ãããã®ä¾ã¯ãã¾ãå®ç¨çã§ã¯ãªããååä»ã颿°å¼ã§åãçµæãå¾ãããªãå ´åã¯ã»ã¨ãã©ããã¾ããã
function create() {
return function (n) {
if (n <= 1) {
return 1;
}
return n * arguments.callee(n - 1);
};
}
const result = create()(5); // 120 (5 * 4 * 3 * 2 * 1) ãè¿ã
Y-çµååãã¤ãã¦ç¡å颿°ã®å帰
颿°å¼ã«ã¯ååãä»ããããããã«ãªãã¾ããããã¢ãã¼é¢æ°ã¯å¸¸ã«ç¡å颿°ã§ãããã¾ã夿°ã«ä»£å ¥ãããªãéãèªåèªèº«ãåç §ã§ãã¾ããã幸ããªãã¨ã«ãã©ã ãè¨ç®ã«ã¯é¢æ°ãç¡åãã¤èªå·±åç §ã§ããç¶æ ã«ãªããã¨ãã§ããåªãã解決çãããã¾ãããã®ææ³ã¯ Y-çµååã¨å¼ã°ãã¾ããããã§ã¯ãã®ä»çµã¿ã«ã¤ãã¦ã¯èª¬æããããããæ©è½ããäºå®ã®ã¿ãè¿°ã¹ã¾ãã
// The Y-combinator: a utility function!
const Y = (hof) => ((x) => x(x))((x) => hof((y) => x(x)(y)));
console.log(
[1, 2, 3, 4, 5].map(
// Wrap the higher-order function in the Y-combinator
// "factorial" is not a function's name: it's introduced as a parameter
Y((factorial) => (n) => (n <= 1 ? 1 : factorial(n - 1) * n)),
),
);
// [ 1, 2, 6, 24, 120 ]
ã¡ã¢: ãã®æ¹æ³ã¯å復å¦çãã¨ã«æ°ããã¯ãã¼ã¸ã£ãå²ãå½ã¦ããããã¡ã¢ãªã¼ä½¿ç¨éãå¤§å¹ ã«å¢å ããå¯è½æ§ãããã¾ããããã§ã¯å¯è½æ§ã示ãããã ãã«åå¨ãã¾ãããæ¬çªç°å¢ã§ã¯é¿ããã¹ãã§ãã代ããã«ä¸æå¤æ°ã¾ãã¯ååä»ã颿°å¼ã使ç¨ãã¦ãã ããã
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-arguments-exotic-objects > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- 颿°ã¬ã¤ã
- 颿°
argumentsFunction.prototype.caller