InternalError: too much recursion
ç¶å½å¼å¼å«éå¤ï¼æå½å¼ç¼ºå°åºç¤æ æ³æï¼æç¼ç JavaScript çãtoo much recursionãæãMaximum call stack size exceededãä¾å¤ã
è¨æ¯
RangeError: Maximum call stack size exceeded (Chrome) InternalError: too much recursion (Firefox) RangeError: Maximum call stack size exceeded. (Safari)
é¯èª¤é¡å
Firefox ä¸çº InternalErrorï¼Chrome å Safari ä¸çº RangeErrorã
åªè£¡åºé¯äºï¼
ä¸åæå¼å«èªå·±çå½å¼ç¨±çºéè¿´å½å¼ã䏿¦æ»¿è¶³æåæ¢ä»¶ï¼å½å¼å°±æåæ¢å¼å«èªå·±ãé稱çºåºç¤æ æ³ã
å¨æäºæ¹é¢ï¼éè¿´é¡ä¼¼æ¼è¿´åãå ©è 齿夿¬¡å·è¡ç¸åçç¨å¼ç¢¼ï¼ä¸é½éè¦ä¸åæ¢ä»¶ï¼ä»¥é¿å ç¡éè¿´åï¼æå¨æ¤æ æ³ä¸æ¯ç¡ééè¿´ï¼ãç¶å½å¼å¼å«éå¤ï¼æå½å¼ç¼ºå°åºç¤æ æ³æï¼JavaScript å°±ææåºæ¤é¯èª¤ã
ç¯ä¾
æ¤éè¿´å½å¼æ ¹æçµæ¢æ¢ä»¶å·è¡ 10 次ã
function loop(x) {
if (x >= 10)
// ãx >= 10ãæ¯çµæ¢æ¢ä»¶
return;
// åäºäºæ
loop(x + 1); // éè¿´å¼å«
}
loop(0);
å°æ¤æ¢ä»¶è¨å®çºä¸å極é«çå¼ï¼å°ç¡æ³éä½ï¼
function loop(x) {
if (x >= 1000000000000) return;
// åäºäºæ
loop(x + 1);
}
loop(0);
// InternalError: too much recursion
éåéè¿´å½å¼ç¼ºå°ä¸ååºç¤æ æ³ãç±æ¼æ²æçµæ¢æ¢ä»¶ï¼å½å¼å°æç¡éå°å¼å«èªå·±ã
function loop(x) {
// 缺å°åºç¤æ
æ³
loop(x + 1); // éè¿´å¼å«
}
loop(0);
// InternalError: too much recursion
Class é¯èª¤ï¼éè¿´éå¤
class Person {
constructor() {}
set name(name) {
this.name = name; // éè¿´å¼å«
}
}
const tony = new Person();
tony.name = "Tonisha"; // InternalError: too much recursion
ç¶ä¸åå¼è¢«ææ´¾çµ¦ name 屬æ§ï¼this.name = name;ï¼æï¼JavaScript éè¦è¨å®è©²å±¬æ§ãç¶éç¨®æ æ³ç¼çæï¼å°±æè§¸ç¼ setter å½å¼ã
卿¤ç¯ä¾ä¸ï¼ç¶ setter è¢«è§¸ç¼æï¼å®è¢«åç¥è¦å次å忍£çäºæ ï¼è¨å®å®æ¬æèççåä¸å屬æ§ãéæå°è´å½å¼ä¸æ·å°å¼å«èªå·±ï¼å¾èé æç¡ééè¿´ã
å¦æå¨ getter ä¸ä½¿ç¨ç¸åçè®æ¸ï¼ä¹æåºç¾æ¤åé¡ã
class Person {
get name() {
return this.name; // éè¿´å¼å«
}
}
çºé¿å æ¤åé¡ï¼è«ç¢ºä¿å¨ setter å½å¼å §é¨ææ´¾ç屬æ§èæåè§¸ç¼ setter ç屬æ§ä¸åãgetter 乿¯å¦æ¤ã
class Person {
constructor() {}
set name(name) {
this._name = name;
}
get name() {
return this._name;
}
}
const tony = new Person();
tony.name = "Tonisha";
console.log(tony);