我被问到一个问题
{
function foo() {
console.log('A');
}
foo();
foo = 1;
function foo() {
console.log('B');
}
foo = 2;
console.log(foo);
}
console.log(foo);Run Code Online (Sandbox Code Playgroud)
为什么第三个输出是1而不是2?
不应该foo创建块作用域,因为该块中既没有let也没有const。但是第二个foo输出2意味着确实foo已经创建了另一个引用。
到底是怎么回事?
PS 我正在使用 Chrome
Version 89.0.4389.90 (Official Build) (x86_64)。
我试图通过阅读原始规范来围绕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 = 0;
if (true) {
console.log(a)
a = 1;
function a() {}
a = 21
console.log(a)
}
console.log(a)Run Code Online (Sandbox Code Playgroud)
在我看来,因为函数声明提升,a = 1以及 a = 21会改变局部函数变量,所以在块中会输出21,外面是0,但真正的结果是在输出1之外。
用chrome调试,结果是这样
当运行时function a() {},它会改变局部和全局变量。太奇怪了?谁能给我解释一下?
我想知道为什么输出是“1”。
var a
{
a = 1
function a() {}
a = 3
}
console.log(a) // 1Run Code Online (Sandbox Code Playgroud)
var a;
console.log('1 a: ' + a);
if (true) {
a = 1;
function a() { };
a = 5;
console.log('2 a: ' + a);
}
console.log('3 a: ' + a);Run Code Online (Sandbox Code Playgroud)
输出是:
1 a: undefined
2 a: 5
3 a: 1
Run Code Online (Sandbox Code Playgroud)
我无法理解最后的输出“3 a: 1”。为什么不是“3 a:5”?
谁能告诉我它是如何逐步工作的,以及为什么结果不同:
第一的:
var a = 'foo';
function a() { };
console.log(a); // fooRun Code Online (Sandbox Code Playgroud)
第二:
// Uncaught SyntaxError: Identifier 'a' has already been declared
{
var a = 'foo';
function a() { };
}
console.log(a);Run Code Online (Sandbox Code Playgroud)
// **only no use strict!!!**
var a = 'foo';
console.log(a); // foo
{
console.log(a); // function a() {} - i guess that is the result of hoisting inside the block but on this step the global variable a …Run Code Online (Sandbox Code Playgroud)