He probado el siguiente código en Firefox y Chrome:
function test() { console.log("***") return [1,2,3] } for (const t of test()) { console.log(t) } La función test se llamó solo una vez. ¿Es el comportamiento estándar para este tipo de bucle? ¿Es como la parte de inicialización del ciclo for ([initialization]; [condition]; [final-expression]) ? No encontré la explicación en MDN y no entendí mucho del estándar ECMA .
La especificación ECMAScript divide la semántica del tiempo de ejecución de la construcción for..in y for..of en dos partes:
ForInOfStatement :
for(Expresión del lado izquierdo de la expresiónofasignación)Declaración
- ¿Será keyResult ? ForIn/OfHeadEvaluation(« », AssignmentExpression , iterar).
- Devolver ? ForIn/ OfBodyE Evaluation (Expresión del lado izquierdo, Declaración , resultado clave , iteración, asignación, conjunto de etiquetas ).
Así que primero tenemos la evaluación de "cabeza" (que involucra la "Expresión de asignación" a la derecha of ), y después de eso, la evaluación del "cuerpo", que usa el resultado clave (no la Expresión de asignación ).
La evaluación "principal" implica la evaluación real en el paso 3 de ese procedimiento:
- Sea exprRef el resultado de evaluar expr .
La evaluación del "cuerpo" implica la iteración real en el paso 6:
- Repetir