对这个JavaScript代码片段感到困惑

对这个JavaScript代码片段感到困惑,javascript,Javascript,对于这段代码,我并不奇怪全局变量“a”的计算结果是5 : 但是,对于这个代码段,全局变量“a”的计算结果为何是10而不是5?这就好像a=5从未发生过 : ​ 这是由于变量提升:使用var关键字定义的任何内容都会被“提升”到当前范围的顶部,从而创建一个局部变量a。请参阅:这与提升有关 在函数中,声明了一个同名的局部变量。即使它发生在您的修改之后,也会被视为在它之前声明过——这称为提升 局部变量用于声明,但不用于值。因此: function someFunc() { alert(localV

对于这段代码,我并不奇怪全局变量“a”的计算结果是5

:

但是,对于这个代码段,全局变量“a”的计算结果为何是10而不是5?这就好像
a=5
从未发生过

:


这是由于变量提升:使用
var
关键字定义的任何内容都会被“提升”到当前范围的顶部,从而创建一个局部变量
a
。请参阅:

这与提升有关

在函数中,声明了一个同名的局部变量。即使它发生在您的修改之后,也会被视为在它之前声明过——这称为提升

局部变量用于声明,但不用于值。因此:

function someFunc() {
    alert(localVar); //undefined
    var localVar = 5;
}
函数,如果用
function name(){…
语法声明,则同时声明和值

function someFunc() {
    alert(someInnerFunc()); //5
    function someInnerFunc() { return 5; }
}

这被称为“
var
声明(和
function()
声明)被移动到其作用域的顶部。

据推测,语句
var a=23
为整个作用域创建了一个局部变量。因此,全局
a
对整个
func()进行了隐藏
,不仅仅是语句下面的行。因此,在第二个代码段中,
a=5
将赋值给下面声明的局部变量。

因此,这里有两件事:和

因为第一个变量声明被“提升”到顶部,所以您的代码相当于:

var a = 10;

function func(){
    var a;
    a = 5;
    a = 23;
}

因为第二个问题,你用一个局部变量“隐藏”了全局变量
a
,所以这些变化不会反映到全局变量
a

哇,我想你的问题已经得到了回答;)+1是一个例子,并且费心解释提升的含义。
function someFunc() {
    alert(someInnerFunc()); //5
    function someInnerFunc() { return 5; }
}
var a = 10;  //a is 10

function func(){
  a = 5; //a is 5
  var a = 23; // a is now in local scope (via hoisting) and is 23
}

func();   

alert(a); // prints global a = 10
var a = 10;

function func(){
    var a;
    a = 5;
    a = 23;
}