为什么块中草率模式函数语句的顺序对全局变量的影响不同?

问题描述 投票:0回答:1

片段 1 -> 输出为“b”


if (true) {
  x = "b";
  function x() {}
}
console.log(x); //b

片段 2 -> 输出为 f x() {}


if (true) {
  function x() {}
  x = "b";
}
console.log(x); // ƒ x() {}

我知道使用严格模式根本不会影响全局变量,但我想知道当严格模式禁用时

x
如何被分配不同的值。

javascript scope function-declaration hoisting
1个回答
0
投票

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

function
声明一个本地(块范围)变量,
x = 'b'
赋值将覆盖该变量。但是,它还会将 function
 声明
处的局部变量
的值暴露给外部作用域,从而创建块后的
console.log(x)
观察到的全局变量。

将代码转换为更明确的

let
声明会导致

// snippet 1
if (true) {
  let _x = function x() {}; // hoisted
  _x = "b"; // assigns local _x
  x = _x; // where the `function` declaration was
}
console.log(x); // b

// snippet 2
if (true) {
  let _x = function x() {}; // hoisted
  x = _x; // where the `function` declaration was
  _x = "b"; // assigns local _x
}
console.log(x); // ƒ x() {}
© www.soinside.com 2019 - 2024. All rights reserved.