2015-02-09 42 views
2

尝试理解javascript的基础知识我遇到以下代码,并且名为“foo”的变量的期望值将是7和5,但出现为7和7.不知道为什么。 ...javascript中的全局和局部变量执行上下文

var foo = 5; 
(function Test() { 
    foo = 7; 
    console.log("foo=" + foo); 
})(); 
console.log("foo=" + foo); 

foo=7 
foo=7 
+1

可能重复[JavaScript的变量的范围是什么?](http://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript) – ncksllvn 2015-02-09 18:08:59

+0

A真好幻灯片上的范围和这...你没有使用这个,但仍然超出范围很好http://davidql.github.io/scope_talk/#/ – w3bMak3r 2015-02-09 18:10:19

+0

@Someone你建议[this](http:// stackoverflow .com/a/500459/1854575)不会回答他们的问题吗?真的吗? – ncksllvn 2015-02-09 18:10:35

回答

3

因为当你做foo = 7;它使全局变量并将其设置为7,即使在功能完成它仍然7。你可能希望它是一个局部变量:

(function Test() { 
    var foo = 7; 
    console.log("foo=" + foo); 
})(); 
+0

谢谢。当我阅读你的回复时,我立即明白了我误解的内容。 – DaeYoung 2015-02-09 18:23:31

2

要得到7和5,你需要把“var”放在“foo = 7;”之前。在你的函数中,以防止覆盖你在函数之外声明的全局foo。

也就是说,在声明函数中的变量时,您需要使用var,以使它们在本地作用于该函数。

0

您正在声明一个全局变量,然后在函数内引用它。如果你想要一个局部变量,使用var关键字在你的函数中声明它。

//foo variable definition here 
var foo = 5; 

(function Test() { 
    //Referencing the already globally defined var. 
    //Use var foo = 7 in order to define a new local var. 
    foo = 7; 
    console.log("foo=" + foo); 
})(); 
console.log("foo=" + foo); 
0

在立即调用的匿名方法中引用全局变量并不意味着它会覆盖全局范围中的变量!

foo=7之类的东西只有在没有其他foo可以从当前范围访问时才会创建一个新变量。在这种情况下存在!

立即调用匿名函数不是一个完全隔离的范围。作为一个函数,它有一个局部范围,在块外部不可用。但它仍然可以进入全球范围。