我写这个简单的程序来更新JS吊装的价值。但根据我的理解,全局x需要更新,但它没有更新。
x = 5;
var w = function(){
x = 7
var x;
console.log(x);
x = 10;
console.log(x);
};
w();
console.log(x);
输出:
有没有人可以更详细地解释为什么它没有更新全局x?
Javascript工作于值的引用所以当我写x = 7时,它应该更新全局x。但它不是! 所以我只是想为什么x = 7不起作用?
谢谢!
答案 0 :(得分:5)
在函数内部声明变量的那一刻,由于作用域规则从内到外的工作方式,它掩盖了全局变量。因此,首先找到函数级var x变量,而不是您期望的全局变量。
JS转换了你的函数:
function(){
x = 7
var x;
console.log(x);
x = 10;
console.log(x);
}
到此:
function(){
var x;
x = 7
//var x;
console.log(x);
x = 10;
console.log(x);
}
关于更新x = 7然后声明var x的问题,让我再解释一下。 Javascript代码不仅仅是执行,还有一个编译阶段。在这个阶段,var声明在函数内部查看(除了发生的许多其他事情,但我只是坚持手头的问题)。 如果找到,它们将移动到函数的顶部。这称为吊装。此时您可以认为您的代码已被JS修改(var声明和赋值的顺序现在并不重要)。如果您只是认为代码被解释,那么订单很重要,但正如我所说,由于编译阶段,提升发生并且没有用这些术语思考会导致您产生混淆。一旦你从编辑,提升角度看它,事情看起来更清楚。
希望它有所帮助! 如需进一步学习,请阅读/收听javascript权威的Kyle Simpson。
答案 1 :(得分:2)
因为您在函数的本地范围内重新声明了x
。这是您指定的10
而不是全局的。
抛弃var x;
,它会起作用。
x = 5;
var w = function(){
x = 7
// var x;
console.log(x);
x = 10;
console.log(x);
};
w();
console.log(x);
话虽这么说,令你感到困惑的是hoisting
Hoisting是JavaScript将所有声明移动到当前作用域顶部(到当前脚本或当前函数的顶部)的默认行为。
x = 5;
var w = function(){
x = 7
var x; // this is moved to the top of the local scope
console.log(x);
x = 10;
console.log(x);
};
w();
console.log(x);
答案 2 :(得分:0)
永远记住,局部变量的优先级高于任何其他变量,并且请对全局变量和局部变量使用正确的命名约定,从而防止导致此类错误。 在巨大的项目中很难被发现。