如果我在 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
- Let keyResult be ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate).
- Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet).
所以我们首先有“head”评估(涉及of
右边的“AssignmentExpression”),然后是“body”评估,它使用keyResult (不是 AssignmentExpression)。
"head" evaluation 涉及该过程第 3 步中的实际评估:
- Let exprRef be the result of evaluating expr.
"body" evaluation涉及第6步的实际迭代:
- Repeat
我已经在 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
(
LeftHandSideExpressionof
AssignmentExpression)
Statement
- Let keyResult be ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate).
- Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet).
所以我们首先有“head”评估(涉及of
右边的“AssignmentExpression”),然后是“body”评估,它使用keyResult (不是 AssignmentExpression)。
"head" evaluation 涉及该过程第 3 步中的实际评估:
- Let exprRef be the result of evaluating expr.
"body" evaluation涉及第6步的实际迭代:
- Repeat