JavaScript中实体的运行时语义

JavaScript中实体的运行时语义,javascript,Javascript,在中,JavaScript中主体计算的运行时语义为: 在运行以下代码时,我希望创建两个函数对象,for body的每个迭代一个 for(设x=0;x

在中,JavaScript中主体计算的运行时语义为:

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

for(设x=0;x<2;x++){
函数f(){}
}
这包括在4.b中吗。在上述规范片段中?

是的,事实上,第4.b点描述了对
for
循环的
主体(中标识的语句)进行求值,在您的示例中,这意味着创建了函数对象
f

这在每次迭代中都会发生(步骤4)

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

let set=新集合;
for(设x=0;x<2;x++){
函数f(){}
增加(f);
}
console.log(set.size);//Chrome、Firefox和Edge中的2个
这包括在4.b中吗。在上面的规范片段中

不完全是。该片段中的第4b点只是说,无论主体是什么,主体都会在每次迭代中再次得到评估

主体本身就是陈述

{
    function f() {}
}

为了了解如何评估它,我们需要查看,它确实为主体创建了词汇环境(嵌套在词汇环境中,循环头中声明了变量
x
),并运行,如果函数被实例化并绑定到名称
f

请链接和/或引用您正在使用的规范,不要发布绘画。“绘画”lol!请注意,您的屏幕截图是13.7.4.9,但您似乎在讨论13.7.4.8。更多的理由是不使用文本截图…我看不到一个很好的方式来格式化文本,所以与规格的复杂性。如果我错过了什么,请让我知道。在另一个问题中,我煞费苦心地格式化了一个“代码块”,结果很差:在我的计算机上,结果是1。集合中有一个包含2个函数的数组。set.entries().next().value.length是2。@Ben,如果集合有两个条目,那么根据定义,它们是不同的,因为集合不能有重复项。现在,显然有些环境确实产生了相同的函数对象(Quentin报告了这一点),这很可能是JavaScript引擎优化的结果。我得到2作为这个脚本的输出。@Ben我正在使用Safari 11。1@Ben关于另一个注释,您是对的:绑定。我将在回答中更正这一部分。我为狩猎行为创建了一个问题。