如果我在 JavaScript for-of 循​​环的 head 部分调用一个函数,它是否保证只被调用一次?

If I call a function in the head section of JavaScript for-of loop, is it guarantied to be called only once?

我已经在 Firefox 中尝试了下面的代码 Chrome:

function test() {
    console.log("***")
    return [1,2,3]
}

for (const t of test()) {
    console.log(t)
}

test 函数只调用了一次。这是这种循环的标准行为吗?是不是像for ([initialization]; [condition]; [final-expression])循环的初始化部分?我没有在 MDN and I didn't understand much from ECMA standard.

上找到解释

ECMAScript 规范将 runtime semantics of the for..in and for..of construct 分为两部分:

ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement

  1. Let keyResult be ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate).
  2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet).

所以我们首先有“head”评估(涉及of右边的“AssignmentExpression”),然后是“body”评估,它使用keyResult (不是 AssignmentExpression)。

"head" evaluation 涉及该过程第 3 步中的实际评估:

  1. Let exprRef be the result of evaluating expr.

"body" evaluation涉及第6步的实际迭代:

  1. Repeat