javascript - JavaScript 中 for-body 的运行时语义

标签 javascript

the specification ,JavaScript 中 for-body 求值的运行时语义是:

enter image description here

运行以下代码时,我希望创建两个函数对象,for-body 的每次迭代创建一个。

for(let x = 0; x < 2; x++) {
    function f() {}
}

这是否包含在 4.b 中?在上面的规范片段中?

最佳答案

是的,确实section 13.7.4.8 of the EcmaScript 2015 specification ,第 4.b 点描述了对 for 循环的主体(语句,如 13.7.4.7 中标识)进行求值,在您的示例中这意味着该函数对象 f 已创建。

每次迭代都会发生这种情况(第 4 步)。

您可以按如下方式监视双重创建:

let set = new Set;

for(let x = 0; x < 2; x++) {
    function f() {}
    set.add(f);
}

console.log(set.size); // 2 in Chrome, Firefox and Edge

我在 Chrome、FireFox 和 Edge 中得到输出 2。有些报告 1 作为输出。这很可能是 JavaScript 引擎可能进行的优化。

在此背景下,mdn备注:

Functions can be conditionally declared, that is, a function statement can be nested within an if statement, however the results are inconsistent across implementations and therefore this pattern should not be used in production code. For conditional function creation, use function expressions instead.

此评论也适用于循环结构,因为它们也是有条件执行的。因此,使用函数表达式可以获得更可靠的结果:

let set = new Set;

for(let x = 0; x < 2; x++) {
    var f = function f() {};
    set.add(f);
}

console.log(set.size); // 2 in Chrome, Firefox and Edge

请注意,在这两个代码段中,f 的作用域并不在 for 主体内,而是在周围的作用域内。因此,f 在循环完成后即可访问。

关于javascript - JavaScript 中 for-body 的运行时语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60415791/

相关文章:

javascript - 无法使用 e.target 获取父级 div 类列表

javascript - 如何使用 jquery 将所选元素从一个下拉组列表 (optgroup) 移动到另一个下拉组列表 (optgroup)?

javascript - 在 javascript 中迭代整数,其中每个值等于一位数字

javascript - innerHTML 不尊重缩进

javascript - 使用 JavaScript 设置桌面背景图片

javascript - 主干 View 无法使用获取的 json

jquery - 无法加载 highcharts.js 和 highmaps.js(map.js 不起作用)

javascript - 如何使用 Jest 将 Axios 模拟为默认导出

c# - signalR 的客户端特定消息

JavaScript 应用程序在 Freeswitch 中不工作