我试图通过阅读原始规范来围绕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
为什么以下代码在Chrome和Firefox之间输出不同的结果?
f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;}
}
})();
console.log(f());
Run Code Online (Sandbox Code Playgroud)
在Chrome中:结果是false
.但是,在Firefox中,它是true
.
以上代码的关键行是第4行,根据我对函数名称提升的了解,该函数g
应该在第6行,即第2行被第6行覆盖.IMO,Chrome的行为是正确的.
我对吗?如果是这样,为什么Firefox输出不同的结果?
我想知道为什么输出是“1”。
var a
{
a = 1
function a() {}
a = 3
}
console.log(a) // 1
Run Code Online (Sandbox Code Playgroud)