2014-09-06 86 views
2

我刚刚显示的警报值,但我得到a是不明确的原因?我会解释一下问题:为什么变量是全局声明的undefined?

首先我用false参数调用函数,它用a = 1;显示提醒。但是当我通过true作为参数时,它首先显示警报2(如预期的那样是本地),但是当它再次显示2?第三个说a是undefined

function ab(p){ 
    a = 1; 
    if(p){ 
     var a = 2 
     alert(a) 
    } 
    alert(a) 
} 

ab(false); 
alert(a); 

意外的结果ab(true)

+0

'a'未定义,因为它从未在全局范围内声明。 – 2014-09-06 08:34:04

+0

请阅读此:http://docstore.mik.ua/orelly/webprog/jscript/ch04_03.htm **和** http://www.adequatelygood.com/JavaScript-Scoping-and-Histing.html – 2014-09-06 15:59:12

回答

4

这就是所谓的可变悬挂。而实际上你认为是全球变量的变量将在该函数内部被提升,并且会变成本地变量。

编译器会认为你这样的代码,

function ab(p){ 
    var a; //will be hoisted here. 
    a=1; 
    if(p){ 
    a=2; 
    alert(a); 
    } 
    alert(a); 
} 
+0

意思是如果条件使一个(全局变量)局部变量 – 2014-09-06 07:38:33

+0

否..请阅读关于变量提升。这将有助于你在这种情况下。 – Balachandran 2014-09-06 07:39:43

+0

varible托管和功能托管的概念在哪里? – 2014-09-06 07:39:53

2

这不是全球性的。你在if条件中定义了变量。它的上下文将只保留在里面。使用方法:

function ab(p){ 
     a=1; 
     if(p){ 
      a=2 
      alert(a) 
     } 
     alert(a) 
    } 

ab(false); 
alert(a); 

Working Demo

+0

I没有得到..每当我使变量没有使用变量它变得全球 – 2014-09-06 07:35:06

+1

你甚至可以跳过第一次声明'var a =''' – javiyu 2014-09-06 07:35:39

+0

@PlalaviSharma:是的,它会。 T.J.看到这个答案。 Crowder -http://stackoverflow.com/a/5786899/1719752 – 2014-09-06 07:39:58

1

您使用var你的函数里面,这样的JavaScript下面看到你的代码(也就是不管你在哪里使用var,里面if或在循环或...):

function ab(p) { 
    var a=1; 
    if (p) { 
     a=2; 
     alert(a); 
    } 

    alert(a); 
} 

ab(false); 
alert(a);