2017-04-21 122 views
2

我写这个简单的程序来更新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

您在函数内部重新声明的'x''映射全局函数。 –

+0

嘿,伙计们,我刚刚更新了我的问题。我在js方面有很好的经验。所以我有关于scopping的想法,我该如何解决这个问题。但我只想知道为什么x = 7不更新? –

+0

我在x = 7之后定义了局部x,所以x = 7应该更新全局,然后编译器移动到下一行。但是x = 7没有更新全局,这是我主要关心的问题? –

回答

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

吊装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); 
+0

你可以补充你的答案,解释在Javascript中采用的方式,以及为什么在函数内部重新声明x overrode global x – Lixus

+0

@Lixus你可以通过点击“编辑”按钮 - 感觉自由 –

+0

所以你想说,如果我更新任何全局变量在任何函数和任何点之内我定义与全局变量相同的本地变量名称。那么全局函数的所有更新都会重置? –

4

你宣布你的函数内部变量的那一刻,它掩盖了全局变量,由于道路范围规则从内工作外。所以,函数级别的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,然后宣布变种X,让我解释多一点的问题。 Javascript代码不只是执行,还有一个编译阶段。在这个阶段中,var声明在函数内部进行了查看(除了发生的其他事情之外,我只是坚持了这个问题)。 如果找到,它们将移到该函数的顶部。这被称为提升。在这个时候,你可以认为你的代码已经被JS修改了(var声明和赋值的顺序现在无关紧要)。如果你只是想到代码被解释,然后顺序很重要,但正如我所说,由于汇编阶段,吊装会发生,而不是以这些词汇来思考会导致你的困惑。一旦你从汇编看起来,提升角度,事情看起来更清晰。

希望它有帮助! 有关进一步研究,请阅读/听凯尔辛普森谁是权威的JavaScript。

+0

是的确有。谢谢!。你的回答非常感谢。 –

0

请记住,局部变量的优先级高于其他任何其他变量,并且请使用适当的命名约定来处理全局变量和局部变量,从而避免导致此类错误。 他们很难在庞大的项目中被发现。