¿Es posible volar el montón o la pila en JS anidando demasiados cierres?

En las implementaciones de JS que probé, los cierres son objetos asignados al montón; por lo tanto, no puede volar la pila a menos que realmente intente evaluar el resultado:

función makeClosure (f) {
función de retorno () {f ()}
}

console.log (“construyendo …”)
let curr = function () {console.log (“hola”)}
para (sea i = 0; i <100000; i ++) {
curr = makeClosure (curr)
}

console.log (“ejecutar”)
curr ()

Imprime “construyendo …” y se bloquea solo después de la “ejecución” (con “Tamaño de pila de llamadas excedido”) Sin embargo, funciona si elimina un cero (~ 10k niveles de anidamiento; la pila probablemente esté limitada por el tamaño, por lo que es probable que obtenga diferentes números con diferentes funciones).

Si reemplaza el for por un while (true) , suceden las mismas cosas que cuando se llena el montón con (casi) cualquier cosa:

  • En Chrome Canary (no sé cuál es el normal), hay un límite de un poco más de 2 GB, donde la pestaña se cierra o falla (vi ambos; en ambos casos solo la pestaña se vio afectada). Dato curioso: intenta hacer una recolección de basura antes de que se rinda, donde las asignaciones se ralentizan visiblemente.
  • Firefox se bloquea a ~ 2.7GB asignado (navegador completo).
  • Microsoft Edge entra en un bucle donde asigna 3 GB, bloquea la pestaña e intenta nuevamente.
  • Internet Explorer 11 asigna 1.7GB y se detiene. El navegador responde, pero la memoria no se desasigna. Podría comenzar el script nuevamente en una nueva pestaña, por otros 1.7 GB (no pude probar un tercero porque mi computadora no respondió; solo tengo 4 GB de RAM).