éæ å: è¯¥ç¹æ§å°æªæ ååãæä»¬ä¸å»ºè®®å¨ç产ç¯å¢ä¸ä½¿ç¨éæ åç¹æ§ï¼å 为å®ä»¬å¨æµè§å¨ä¸çæ¯ææéï¼ä¸å¯è½åçååæè¢«ç§»é¤ãä¸è¿ï¼å¨æ²¡ææ åé项çç¹å®æ åµä¸ï¼å®ä»¬å¯ä»¥ä½ä¸ºåéçæ¿ä»£æ¹æ¡ã
å·²å¼ç¨: ä¸åæ¨è使ç¨è¯¥ç¹æ§ãè½ç¶ä¸äºæµè§å¨ä»ç¶æ¯æå®ï¼ä½ä¹è®¸å·²ä»ç¸å ³ç web æ åä¸ç§»é¤ï¼ä¹è®¸æ£åå¤ç§»é¤æåºäºå ¼å®¹æ§èä¿çã请尽éä¸è¦ä½¿ç¨è¯¥ç¹æ§ï¼å¹¶æ´æ°ç°æç代ç ï¼åè§æ¬é¡µé¢åºé¨çå ¼å®¹æ§è¡¨æ ¼ä»¥æå¯¼ä½ ä½åºå³å®ã请注æï¼è¯¥ç¹æ§éæ¶å¯è½æ æ³æ£å¸¸å·¥ä½ã
夿³¨ï¼ å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼è®¿é®å½æ°ç caller
屿§ä¼æåºé误ââ该 API 已被移é¤ä¸æ²¡ææ¿ä»£åãè¿æ¯ä¸ºäºé²æ¢ä»£ç è½å¤âéåå æ âï¼è¿æ¢åå¨å®å
¨é£é©ï¼ä¹ä¸¥ééå¶äºå
èåå°¾è°ç¨ä¼åçä¼åçå¯è½æ§ãå¦éæ´å¤è§£éï¼è¯·é
读 arguments.callee çå¼ç¨åå ã
Function
å®ä¾ç caller
访é®å¨å±æ§è¿åè°ç¨è¯¥å½æ°ç彿°ã对äºä¸¥æ ¼æ¨¡å¼ãç®å¤´å½æ°ã弿¥å½æ°åçæå¨å½æ°æ¥è¯´ï¼è®¿é® 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
ï¼ä»¥ç¹æ®å¤çéä¸¥æ ¼æ¨¡å¼ç彿°ç this
å¼ã
(function f() {
if (Object.hasOwn(f, "caller")) {
console.log(
"caller æ¯ä¸ä¸ªèªæå±æ§ï¼å
·ææè¿°ç¬¦",
Object.getOwnPropertyDescriptor(f, "caller"),
);
} else {
console.log(
"f 没æå为 caller çèªæå±æ§ãå°è¯è·å f.[[Prototype]].caller",
);
console.log(
Object.getOwnPropertyDescriptor(
Object.getPrototypeOf(f),
"caller",
).get.call(f),
);
}
})();
// å¨ Chrome ä¸ï¼
// caller æ¯ä¸ä¸ªèªæå±æ§ï¼å
·ææè¿°ç¬¦ {value: null, writable: false, enumerable: false, configurable: false}
// å¨ Firefox ä¸ï¼
// f 没æå为 caller çèªæå±æ§ãå°è¯è·å f.[[Prototype]].caller
// null
æ¤å±æ§åä»£äº arguments
对象çå·²å¼ç¨ç arguments.caller
屿§ã
åºäºå®å
¨åå ï¼ç¹æ®å±æ§ __caller__
已被移é¤ï¼å®è¿åè°ç¨è
çæ¿æ´»å¯¹è±¡ï¼ä»èå
许éå»ºå æ ã
以ä¸ä»£ç æ£æ¥å½æ°ç caller
屿§çå¼ã
function myFunc() {
if (myFunc.caller === null) {
return "è¯¥å½æ°æ¯ä»é¡¶å±è°ç¨çï¼";
} else {
return `è¯¥å½æ°çè°ç¨è
æ¯ ${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();
})();
// è¾åº [Function: callerFunc]
(function () {
strictCallerFunc();
})();
// è¾åº 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