Это происходит потому, что у JS есть стек, в котором он ставит в очередь вызовы функций, и существует предел памяти, назначенной этому стеку.
Вы должны заключить рекурсивный вызов функции в setTimeout, setImmediateили process.nextTick, чтобы дать возможность node.js очистить стек.Если вы этого не сделаете и существует много циклов без какого-либо реального асинхронного вызова функции или если вы не ждете обратного вызова, ваш RangeError: Превышен максимальный размер стека вызовов будет неизбежен.
При этом сейчасВ вашем первом коде вы выполняете
i % 1000
, что сравнительно легче, чем операция, выполняемая во втором коде
i % 10000
1-й фрагмент кода запускается слишком много раз, потому чтостек освобождается к тому времени, когда следующий вызов помещается в очередь, но во втором фрагменте кода процессор все еще выполняет операцию, пока вызовы суммируются.Третий фрагмент кода на самом деле выполняется много раз, но в конечном итоге возвращает ошибку, потому что снова стек был засорен.
Пожалуйста, попробуйте поместить оператор log в третий фрагмент кода и попробуйте его.Это прояснит вам ситуацию.