2012-11-17 42 views
0

可能重复:
variable hoisting局部变量影响全局变量 - JavaScript变量的作用域

var a = "global"; 

    //version 1 
    function changeGlobal(){ 
     alert(a); //why is 'a' undefined here? 
     if(a){ 
     var a = "local"; 
     alert(a); 
     } 
    } 
    //version 2 
    function changeGlobal(){ 
     alert(a); //why is 'a' 'global' here? what diff does 'var a="local"' make? 
     if(a){ 
     //var a = "local"; 
     alert(a); 
     } 
    } 
    changeGlobal(); 

问题是内联。帮助我了解变量范围。

+1

这个问题不是重复的,即“变量提升”,即“全局范围”,表现出实现异常,尽管它是相关的。 – 2012-11-17 03:27:23

+0

@jAndy有很多JS的问题,我试着在看这对夫妇之前试过。另外,我正在阅读'Alexei White'的书'javascript',并且他从来没有谈论过悬挂。 –

+0

为什么你的函数具有相同的名称,为什么'var a ='local''在后者中被注释掉了?我们应该如何确定哪些函数被称为变量被设置的顺序? –

回答

4

在JavaScript中,变量声明被'悬挂'到函数的顶部,与您声明它们的位置无关。

因此,在changeGlobal的第一个变体中,当您声明var a = "local"时,a变量声明被悬挂到顶部。变量的赋值也不会被挂起,所以在你提醒a时,它的一个未赋值变量,因此未定义。

也就是说,

function changeGlobal(){ 
    alert(a); //why is 'a' undefined here? 
    if(a){ 
    var a = "local"; 
    alert(a); 
    } 
} 

相当于

function changeGlobal(){ 
    var a; // hoisted here (not assigned a value yet) 
    alert(a); //why is 'a' undefined here? 
    if(a){ 
    a = "local"; // only assigned a value here 
    alert(a); 
    } 
} 
2

在版本1声明命名a一个局部变量优先于全球achangeGlobal函数中。尽管它在alert(a);调用之后定义,但它的定义将被“悬挂”直到示波器的开始,但直到var a = "local";行才会被初始化。这就是为什么alert(a);显示undefined

在版本2中,由于本地不存在a,因此您总是在处理全局函数a,该函数在函数运行前已经初始化。

1

JavaScript有词法作用域,当变量可从程序/功能被解除引用它在哪里var版,和下(如,引用它不会抛出ReferenceError
var语句也将被悬挂,和初始值设置为undefined

还是在外行人而言,变量的作用域来定义它们在功能,并且所有的变量都可以在功能执行虽然值可能尚未分配过程中的任何一点。

结合起来,这就是你所观察到的ing - 映射全局变量的局部变量。

+0

我会说“函数范围”(因为ECMAScript没有块范围,通常与词法范围相关联),并省略“解除引用”(这甚至意味着什么!?!)的用法。术语ReferenceError是由变量/属性语法结构在内部分解为“引用”(根据规范)的事实而产生的,但不应该将它与“需要为引用进行使用”相混淆。 – 2012-11-17 04:14:24