相关疑难解决方法(0)

这个提升如何与块作用域一起工作?

我被问到一个问题

{
  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)

javascript hoisting

26
推荐指数
1
解决办法
391
查看次数

ES6中块级函数的精确语义是什么?

我试图通过阅读原始规范来围绕ES6中新的标准化块级功能.我的肤浅理解是:

  • 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)

javascript formal-semantics ecmascript-6

19
推荐指数
1
解决办法
5031
查看次数

为什么块赋值会改变全局变量?

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() {},它会改变局部和全局变量。太奇怪了?谁能给我解释一下?

javascript

17
推荐指数
1
解决办法
962
查看次数

输出结果为1,请问这是什么原因

我想知道为什么输出是“1”。

var a
{
  a = 1
  function a() {}
  a = 3
}
console.log(a) // 1
Run Code Online (Sandbox Code Playgroud)

javascript

6
推荐指数
1
解决办法
155
查看次数

为什么最后的输出是“3a:1”(严格为假)?

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”?

javascript ecmascript-5

5
推荐指数
0
解决办法
56
查看次数

顺便说一句,这些具有相同名称的 var 和函数声明的交互如何工作?

谁能告诉我它是如何逐步工作的,以及为什么结果不同:

  1. 为什么在第一种情况下没有 SyntaxError:

第一的:

var a = 'foo'; 
function a() { };
console.log(a); // foo
Run 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)

  1. 函数 a() {} 如何覆盖 var a?

// **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)

javascript

3
推荐指数
1
解决办法
117
查看次数