鿍æº: ãã®æ©è½ã¯æ¨æºåããã¦ãã¾ããã鿍æºã®æ©è½ã¯ãã©ã¦ã¶ã¼ã®å¯¾å¿ãéãããå°æ¥çã«å¤æ´ã¾ãã¯åé¤ãããå¯è½æ§ããããããæ¬çªç°å¢ã§ã®ä½¿ç¨ã¯æ¨å¥¨ããã¾ããããã ããæ¨æºã®é¸æè¢ãåå¨ããªãç¹å®ã®ã±ã¼ã¹ã§ã¯ãæå¹ãªä»£æ¿ææ®µã¨ãªãå ´åãããã¾ãã
鿍奍;: ãã®æ©è½ã¯éæ¨å¥¨ã«ãªãã¾ãããã¾ã 対å¿ãã¦ãããã©ã¦ã¶ã¼ãããããããã¾ãããããã§ã«é¢é£ããã¦ã§ãæ¨æºããåé¤ããã¦ããããåé¤ã®æç¶ãä¸ã§ããããäºææ§ã®ããã ãã«æ®ããã¦ããå¯è½æ§ãããã¾ãã使ç¨ãé¿ããã§ããã°æ¢åã®ã³ã¼ãã¯æ´æ°ãã¦ãã ããããã®ãã¼ã¸ã®ä¸é¨ã«ããäºææ§ä¸è¦§è¡¨ãè¦ã¦å¤æãã¦ãã ããããã®æ©è½ã¯çªç¶åä½ããªããªãå¯è½æ§ããããã¨ã«æ³¨æãã¦ãã ããã
ã¡ã¢: 峿 ¼ã¢ã¼ãã§ã¯ã颿°ã® caller
ã«ã¢ã¯ã»ã¹ããã¨ã¨ã©ã¼ãçºçãã¾ãã API ã¯åé¤ãããä»£æ¿ææ®µãããã¾ãããããã¯ãã³ã¼ãããã¹ã¿ãã¯ãæ©ãããã¨ãé²ãããã§ããããã¯ãã»ãã¥ãªãã£ãªã¹ã¯ãããããã ãã§ãªããã¤ã³ã©ã¤ã³å±éãæ«å°¾å帰å¼ã³åºãæé©åãªã©ã®æé©åã®å¯è½æ§ã大å¹
ã«å¶éãã¾ãããã詳ãã説æã«ã¤ãã¦ã¯ã arguments.callee
ã®éæ¨å¥¨åã®æ ¹æ ãã覧ãã ããã
caller
㯠Function
ã¤ã³ã¹ã¿ã³ã¹ã®ã¢ã¯ã»ãµã¼ããããã£ã§ããã®é¢æ°ãå¼ã³åºãã颿°ãè¿ãã¾ãã峿 ¼ã¢ã¼ããã¢ãã¼é¢æ°ãéåæé¢æ°ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã§ã¯ã caller
ããããã£ã«ã¢ã¯ã»ã¹ãã㨠TypeError
ãçºçãã¾ãã
颿° f
ãæä¸ä½ã®ã³ã¼ãã§å¼ã³åºãããå ´åã f.caller
ã®å¤ã¯ null
ã«ããã以å¤ã®å ´åã®å¤ã¯ f
ãå¼ã³åºãã颿°ã«ãªãã¾ãã f
ãå¼ã³åºãã颿°ã峿 ¼ã¢ã¼ãã®é¢æ°ã§ããå ´åãã f.caller
ã®å¤ã¯ null
ã¨ãªãã¾ãã
ECMAScript 仿§ã§è¦å®ããã¦ããå¯ä¸ã®åä½ã¯ã Function.prototype
ãåæ caller
ã¢ã¯ã»ãµã¼ãæã£ã¦ããã get
ã¾ã㯠set
ã®ãªã¯ã¨ã¹ãã«å¯¾ãã¦ç¡æ¡ä»¶ã« TypeError
ãçºçããããããã¨ï¼ãæ¯è¬ã¢ã¯ã»ãµã¼ãã¨ãã¦ç¥ããã¦ãã¾ãï¼ã§ãããå®è£
ã¯éå³å¯ãªãã¬ã¼ã³é¢æ°ãé¤ãã¦ããã®ã»ãã³ãã£ã¯ã¹ã夿´ãããã¨ã¯è¨±å¯ããã¦ãã¾ããã caller
ããããã£ã®å®éã®åä½ã¯ãã¨ã©ã¼ãçºçããã以å¤ã«ãä½ããã®åä½ãããå ´åãå®è£
ã«ãã£ã¦å®ç¾©ããã¦ãã¾ããä¾ãã°ã Chrome ã¯èªåèªèº«ã§ãã¼ã¿ããããã£ã¨ãã¦å®ç¾©ãã¦ãã¾ããã Firefox 㨠Safari ã¯åæã®æ¯è¬ã§ãã Function.prototype.caller
ã¢ã¯ã»ãµã¼ãæ¡å¼µããé峿 ¼é¢æ°ã§ãããããã®å¤ãç¹å¥ã«å¦çãã¦ãã¾ãã
(function f() {
if (Object.hasOwn(f, "caller")) {
console.log(
"caller is an own property with descriptor",
Object.getOwnPropertyDescriptor(f, "caller"),
);
} else {
console.log(
"f doesn't have an own property named caller. Trying to get f.[[Prototype]].caller",
);
console.log(
Object.getOwnPropertyDescriptor(
Object.getPrototypeOf(f),
"caller",
).get.call(f),
);
}
})();
// In Chrome:
// caller is an own property with descriptor {value: null, writable: false, enumerable: false, configurable: false}
// In Firefox:
// f doesn't have an own property named caller. Trying to get f.[[Prototype]].caller
// null
ãã®ããããã£ã¯ã arguments
ãªãã¸ã§ã¯ãã®å»æ¢ããã arguments.caller
ããããã£ãç½®ãæãã¾ãã
å¼ã³åºãå´ã®ã¢ã¯ãã£ãã¼ã·ã§ã³ãªãã¸ã§ã¯ããè¿ãç¹å¥ãªãããã㣠__caller__
ã¯ãããã«ããã¹ã¿ãã¯ãåæ§ç¯ãããã¨ãå¯è½ã§ããããã»ãã¥ãªãã£ä¸ã®çç±ã«ããåé¤ããã¾ããã
次ã®ã³ã¼ãã¯ã颿°ã® caller
ããããã£ã®å¤ã調ã¹ã¾ãã
function myFunc() {
if (myFunc.caller === null) {
return "The function was called from the top!";
} else {
return `This function's caller was ${myFunc.caller}`;
}
}
ã¹ã¿ãã¯ã®åæ§ç¯ã¨å帰
å帰å¼ã³åºãã®å ´åããã®ããããã£ãç¨ãã¦ã³ã¼ã«ã¹ã¿ãã¯ãåç¾ãããã¨ã¯ã§ãã¾ããã以ä¸ã«ã¤ãã¦èãã¦ã¿ã¾ãããã
function f(n) {
g(n - 1);
}
function g(n) {
if (n > 0) {
f(n);
} else {
stop();
}
}
f(2);
stop()
ãå¼ã³åºãããæç¹ã®ã³ã¼ã«ã¹ã¿ãã¯ã¯ä»¥ä¸ã®ããã«ãªãã§ãããã
f(2) -> g(1) -> f(1) -> g(0) -> stop()
以ä¸ã¯çã«ãªãã¾ãã
stop.caller === g && f.caller === g && g.caller === f;
å¾ã£ã¦ãstop()
颿°ã®ã¹ã¿ãã¯ãã¬ã¼ã¹ã以ä¸ã®ããã«ãã¦åå¾ããã¨ãã¾ãã
let f = stop;
let stack = "Stack trace:";
while (f) {
stack += `\n${f.name}`;
f = f.caller;
}
ããã¯ç¡éã«ã¼ãã«ãªãã¾ãã
峿 ¼ã¢ã¼ãã® callerå¼ã³åºãå´ã峿 ¼ã¢ã¼ã颿°ã§ããå ´åãcaller
ã®å¤ã¯ null
ã§ãã
function callerFunc() {
calleeFunc();
}
function strictCallerFunc() {
"use strict";
calleeFunc();
}
function calleeFunc() {
console.log(calleeFunc.caller);
}
(function () {
callerFunc();
})();
// Logs [Function: callerFunc]
(function () {
strictCallerFunc();
})();
// Logs null
仿§æ¸
ãããã®æ¨æºã§ãå®ç¾©ããã¦ãã¾ããã
ãã©ã¦ã¶ã¼ã®äºææ§ é¢é£æ å ±RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4