函数中的全局变量不更新

Pan*_*tav 2 javascript

我写这个简单的程序来更新JS吊装的价值.但根据我的理解,全局x需要更新,但它没有更新.

x = 5;
var w = function(){
    x = 7
    var x;
    console.log(x);
    x = 10;
    console.log(x);
};
w();
console.log(x);
Run Code Online (Sandbox Code Playgroud)

输出:

  • 7
  • 10

任何人都可以更详细地解释为什么它不更新全局x?

Javascript工作于值的引用,所以当我写x = 7时,它应该更新全局x.但它不是!所以我只是想为什么x = 7不起作用?

谢谢!

Pan*_*kla 5

在函数内部声明变量的那一刻,由于作用域规则从内到外的工作方式,它掩盖了全局变量.因此,首先找到函数级var x变量,而不是您期望的全局变量.

JS转换了你的函数:

function(){
    x = 7
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

对此:

function(){
    var x;
    x = 7
    //var x;
    console.log(x);
    x = 10;
    console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

关于更新x = 7然后声明var x的问题,让我再解释一下.Javascript代码不仅仅是执行,还有一个编译阶段.在这个阶段,var声明在函数内部查看(除了发生的许多其他事情,但我只是坚持手头的问题).如果找到,它们将移动到函数的顶部.这称为吊装.此时您可以认为您的代码已被JS修改(var声明和赋值的顺序现在无关紧要).如果您只是认为代码被解释,那么订单很重要,但正如我所说,由于编译阶段,提升发生并且没有用这些术语思考会导致您产生混淆.一旦你从编辑,提升角度看它,事情看起来更清晰.

希望能帮助到你!如需进一步学习,请阅读/收听有关javascript权限的Kyle Simpson.