javascript - block 中的函数声明将临时值移出 block ?

标签 javascript

var a;
if (true) {
  a = 5;

  function a() {}
  a = 0;
  console.log(a)
}
console.log(a)


我看到上面的代码,在{}中声明了一个函数。我认为它会打印 0 0,但它会打印 0 5

最佳答案

会发生以下情况:
(1) 存在两个变量声明a ,一个在 block 内,一个在 block 外。
(2) 函数声明被提升,并绑定(bind)到内部 block 变量。
(3) a = 5到达,它会覆盖 block 变量。
(4) 到达函数声明,将 block 变量复制到外部变量。现在两人都5岁了。
(5) a = 0到达,它会覆盖 block 变量。外部变量不受此影响。

 var a¹;
 if (true) {
   function a²() {} // hoisted
   a² = 5;
   a¹ = a²; // at the location of the declaration, the variable leaves the block      
   a² = 0;
  console.log(a²)
}
console.log(a¹);
这实际上并不是规范的一部分,它是 web legacy compatibility semantics 的一部分。 ,所以不要依赖此代码以这种方式运行,并且始终 "use strict"; mode .
这也解释了here .

关于javascript - block 中的函数声明将临时值移出 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58619924/

相关文章:

Javascript - 在对象数组中查找(而不是删除)具有重复属性的元素

Javascript 变量或新函数导致 IE 中出现错误

javascript - 如何检查 Node js 中是否存在模块函数

javascript - 运行 VersionOne Javascript SDK 的 example.js 时发生 ETIMEOUT

javascript - 当一个组件的状态发生变化时,如何防止整个列表重新呈现?

javascript - 如何将http重定向到https加上将 `index.html`重定向到.htaccess中的另一个html页面?

javascript - jQuery 接收复选框状态

javascript - jquery从其他数组中删除多个数组

javascript - onkeypress 识别当前 div

javascript - 在 jQuery 中循环结果