JavaScript函数声明后变量如何赋值?

7
以下代码在赋值后记录了值a

var a = []
if (true) {
  a = 1
  function a() {}
  a = 2
  function a() {}
  a = 3
  console.log('0: ', a)
}
console.log('1: ', a)

我猜测输出可能是:
0:  3
1:  3

但实际上,上面的代码记录了

0:  3
1:  2

为什么?

它确实这样吗?你在哪里以及如何执行这个操作? - deceze
@deceze,这个代码片段确实打印出了那个精确的输出。 - VLAZ
@VLAZ 对我来说很有趣。Safari,macOS。我得到了两个3。 - deceze
@deceze 啊...那一定不支持块级作用域函数了。我的结果截图 - Windows 10 上的 Firefox - VLAZ
显示剩余4条评论
1个回答

0

我的理解是,有两个“a”变量。

一个是全局的,另一个在括号范围内。

在第一次赋值时,你将其分配给了全局变量。

当你声明“a”函数时,它具有本地作用域。

它将“a”中的当前值分配给全局变量。

然后,当你再次给“a”赋值时,它会将其分配给本地作用域变量。

由于某种原因,重新声明函数名称会使其将本地变量的值分配给全局变量。不知道为什么。

var a = [] // assigns to global

if (true) {
  a = 1 // assigns to global
  function a() {} // pushes value to global and creates a local "a" variable
  a = 2  // assigns to local
  function a() {} // pushes value to global
  a = 3  // assigns to local
  console.log('0: ', a) // outputs the local varaible
}
console.log('1: ', a)  // outputs the last pushed global which is 2


以某种原因,在重新声明函数名称时,会将局部变量的值分配给全局变量。不知道为什么。好吧,这是老旧的提升现象。函数声明总是首先被处理,var foo = 1; function foo() {} 被处理得像是 function foo() {}; var foo; foo = 1;。 - VLAZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接