ๆญค้ ้ข็”ฑ็คพ็พคๅพž่‹ฑๆ–‡็ฟป่ญฏ่€Œไพ†ใ€‚ไบ†่งฃๆ›ดๅคšไธฆๅŠ ๅ…ฅ MDN Web Docs ็คพ็พคใ€‚

View in English Always switch to English

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 ๆฌกใ€‚

js
function loop(x) {
  if (x >= 10)
    // ใ€Œx >= 10ใ€ๆ˜ฏ็ต‚ๆญขๆขไปถ
    return;
  // ๅšไบ›ไบ‹ๆƒ…
  loop(x + 1); // ้ž่ฟดๅ‘ผๅซ
}
loop(0);

ๅฐ‡ๆญคๆขไปถ่จญๅฎš็‚บไธ€ๅ€‹ๆฅต้ซ˜็š„ๅ€ผ๏ผŒๅฐ‡็„กๆณ•้‹ไฝœ๏ผš

js
function loop(x) {
  if (x >= 1000000000000) return;
  // ๅšไบ›ไบ‹ๆƒ…
  loop(x + 1);
}
loop(0);

// InternalError: too much recursion

้€™ๅ€‹้ž่ฟดๅ‡ฝๅผ็ผบๅฐ‘ไธ€ๅ€‹ๅŸบ็คŽๆƒ…ๆณใ€‚็”ฑๆ–ผๆฒ’ๆœ‰็ต‚ๆญขๆขไปถ๏ผŒๅ‡ฝๅผๅฐ‡ๆœƒ็„ก้™ๅœฐๅ‘ผๅซ่‡ชๅทฑใ€‚

js
function loop(x) {
  // ็ผบๅฐ‘ๅŸบ็คŽๆƒ…ๆณ
  loop(x + 1); // ้ž่ฟดๅ‘ผๅซ
}

loop(0);

// InternalError: too much recursion

Class ้Œฏ่ชค๏ผš้ž่ฟด้Žๅคš

js
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 ไธญไฝฟ็”จ็›ธๅŒ็š„่ฎŠๆ•ธ๏ผŒไนŸๆœƒๅ‡บ็พๆญคๅ•้กŒใ€‚

js
class Person {
  get name() {
    return this.name; // ้ž่ฟดๅ‘ผๅซ
  }
}

็‚บ้ฟๅ…ๆญคๅ•้กŒ๏ผŒ่ซ‹็ขบไฟๅœจ setter ๅ‡ฝๅผๅ…ง้ƒจๆŒ‡ๆดพ็š„ๅฑฌๆ€ง่ˆ‡ๆœ€ๅˆ่งธ็™ผ setter ็š„ๅฑฌๆ€งไธๅŒใ€‚getter ไนŸๆ˜ฏๅฆ‚ๆญคใ€‚

js
class Person {
  constructor() {}
  set name(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
}
const tony = new Person();
tony.name = "Tonisha";
console.log(tony);

ๅƒ่ฆ‹