f=_=>do{try{-~f()}catch(e){}}
- 2 bytes guardados gracias a Neil.
Pruébelo aquí , o use el fragmento a continuación para probarlo en evallugar de do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Puerto Japt , 24 bytes
Realmente no vale la pena publicar esto como una solución separada, ya que es, esencialmente, idéntico.
Ox`try\{-~rp()}¯t®(e)\{}
Pruébalo
Explicación
JavaScript en sí mismo no tiene un límite de recursión per se, sino que el intérprete impone el límite (es decir, el navegador). ¡Qué bueno que definimos los idiomas por su intérprete aquí! Entre otros factores, el límite puede variar según el navegador y la memoria disponible, lo que se ve afectado por las operaciones que se realizan. El siguiente fragmento ilustra ese último punto, usando las 5 versiones diferentes de esta solución que pasé. Como puede ver en las últimas 2 pruebas, en Chrome, al menos, incluso el orden de las operaciones puede marcar la diferencia.
console.log((f=(i=0)=>eval(`try{f(i+1)}catch(e){i}`))())
console.log((f=i=>eval(`try{f(-~i)}catch(e){i}`))())
console.log((f=(i=0)=>eval(`try{f(++i)}catch(e){i}`))())
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
console.log((f=_=>eval(`try{f()+1}catch(e){0}`))())
console.log((f=_=>eval(`try{1+f()}catch(e){0}`))())
Dado eso, por lo tanto, no tenemos la conveniencia de una constante o método para trabajar. En cambio, vamos a crear una función que se llame a sí misma de forma continua antes, eventualmente, a la basura. En su forma más simple que es:
f=_=>f()
Pero eso no nos sirve para este desafío, ya que solo arroja un error de desbordamiento sin indicación de cuántas veces se fllamó a sí mismo. Podemos evitar el error trying a la llamada fde forma continua y catching cuando falla:
f=_=>{try{f()}catch(e){}}
No hay error, pero aún no hay valor de retorno de cuántas veces la función logró llamarse a sí misma antes de fallar, porque en catchrealidad no está haciendo nada. Intentemos evaluar la try / catchdeclaración:
f=_=>eval(`try{f()}catch(e){}`)
Ahora tenemos un valor que se devuelve (y, dado que se trata de un código de golf, nos ahorramos unos pocos bytes al usar un real return). Sin embargo, el valor que se devuelve es undefinednuevamente porque catchno está haciendo nada. Afortunadamente para nosotros -~undefined==1y -~n==n+1, por lo tanto, al abrir una -~llamada en frente de la llamada f, esencialmente tenemos -~-~ ... -~-~undefined, con otra -~antepuesta con cada llamada, dándonos la cantidad de veces que fse llamó.
f=_=>eval(`try{-~f()}catch(e){}`)