功能提升改变var值

Nag*_*Nag 3 javascript

任何人都可以解释我为什么会得到不同的输出?

代码1:

var a = 1;

function b() {
  a = 10;
  console.log(a); //output 10
}

b();
console.log(a); //output 10
Run Code Online (Sandbox Code Playgroud)

代码2:

var a = 1;

function b() {
  a = 10;
  console.log(a); //output 10
  function a() {}
}

b();
console.log(a); //output 1
Run Code Online (Sandbox Code Playgroud)

为什么我在调用函数"b"后得到"a"变量的不同输出?需要一些明确的解释这里真正发生了什么?

voi*_*oid 5

我会说案例1是非常不言自明的,因为它的值a被覆盖了a=10.

在案例2中,由于function a() {}和因hoisting变量声明和函数定义移动到最接近的词汇范围,这是function b()function a()这样a的作用范围function b()和改变其值不会影响全球的价值a,而是将function a()被覆盖.

因为全局值没有改变,所以console.log(a)当前外部function b()正在记录1.