我试图通过阅读原始规范来围绕ES6中新的标准化块级功能.我的肤浅理解是:
然而,由于这些语义的一部分被指定为"可选的"并且仅对于Web浏览器是必需的(附件B),因此这进一步复杂化.所以我想填写下表:
| Visible outside of block? | Hoisted? Up to which point? | "TDZ"? |
------------------------------------------------------------------------------------------------------------------------
| Non-strict mode, no "web extensions" | | | |
| Strict mode, no "web extensions" | | | |
| Non strict mode, with "web extensions | | | |
| Strict mode, with "web extensions" | | | |
另外我不清楚在这种情况下"严格模式"是什么意思.这种区别似乎在附件B3.3中引入,作为函数声明的运行时执行的一些附加步骤的一部分:
1. If strict is false, then
...
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,strict指[[Strict]]的是函数对象的内部插槽.这是否意味着:
// Non-strict …Run Code Online (Sandbox Code Playgroud) var a;
if (true) {
a = 5;
function a() {}
a = 0;
console.log(a)
}
console.log(a)Run Code Online (Sandbox Code Playgroud)
我看到了上面的代码,在{}中声明了一个函数。我认为它会打印0 0,但它会打印0 5
如果我们声明一个变量和一个具有相同名称的函数,则它接受重新声明。但是,当我们在一个块内执行相同的操作时,它会显示重新声明错误。
码:
var x;
function x() {}; // no error.Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,我得到了错误。
{
var inside; // re-declaration error.
function inside() {};
}Run Code Online (Sandbox Code Playgroud)
预期结果应该没有错误。