//情况一
var i = 0;
function a()
{
window.alert(i); //弹出全局变量0
}
a();//情况二
var i = 0;
function a()
{ var i = 2;
window.alert(i); //弹出局部变量2

}
a();//情况三
var i = 0;
function a()
{
window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
var i = 2;
}
a();

解决方案 »

  1.   

    首先 要理解js变量的作用域 先找局部变量 最后一步是找全局变量
    情况1:
      函数a里未定义局部变量i 所以找全局变量i 找到了是0
    情况2:
       已定义了局部变量i js不会再去找全局变量 所以alert的是2
    情况3:
       js是解释型语言 这么写变量i被局部了 不会去找全局变量 在alert之前未定义i 所以undefined
      

  2.   

    和作用域关系不大。看下解析和执行顺序吧
    我把你的第三个稍微修改下。
    (1)var i = 0;
    (2)function a()
    {
        (3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
        (4)var i = 2;
    }
    a();(1) (2) (4) (3)
      

  3.   

    function a()
    {
        window.alert(i); //它要现在 函数体 里找 i
        var i = 2;
    }我也测试过,var i = 0;
    alert(i) //没问题
    alert(i) //undefined
    var i = 0;
    alert(i) //出错
    alert(i) //出错
    i=0
    我也 疑惑啊。
      

  4.   

    随便找了下秦歌博客的一篇
    http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
      

  5.   

    这个问题就是个变量的作用域链问题
    你把你的第一步移到最后 它还是会去找全局变量 与顺序无关
    (2)function a()
    {
      (3)window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
    }
    (1)var i = 0;
    a();//还会弹出0
      

  6.   


    //情况三
    var i = 0;
    function a()
    {
        window.alert(i); //为什么这里会弹出undefined,而不是全局变量0
        var i = 2;
    }
    a();你这断代码其实等价于下面这样//情况三
    var i = 0;
    function a()
    {
        var i; 
        window.alert(i); 
        i = 2;
    }
    a();
    所以那里弹出undefined
    1.javascript的会把变量声明放到函数的最前面。
    2.a方法的alert(i),i变量,js会先找a方法内的变量i,如果没有,向外层找i变量。(变量的scope)
    通过以上二点就能解释这三种情况了
      

  7.   

    猜测是js先给声明变量后执行其它代码的原因吧,记得头几天有个类似的帖子var i = 0;【1】
    function a()
    {
        window.alert(i); //【3】
        var i = 2;【2】
    }
    a();如果如我猜测那样,那么首先给【1】分配内存,接着是【2】,然后执行【3】,因为【1】被【2】屏蔽了(因为【2】比【1】优先),所以alert前面找不到i所以undefined
      

  8.   

    当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。所以,就会出现当JavaScript解释器执行下面脚本时不会报错:alert(a);                            // 返回值undefinedvar a =1;alert(a);                          // 返回值1由于变量声明是在预编译期被处理的,所以在执行期间对于所有代码来说,都是可见的。但是,你也会看到,执行上面代码,提示的值是undefined,而不是1。这是因为,变量初始化过程发生在执行期,而不是预编译期。在执行期,JavaScript解释器是按着代码先后顺序进行解析的,如果在前面代码行中没有为变量赋值,则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了,所以在第三行代码中会提示变量a的值为1,而不是 undefined。具体参考
    JavaScript变量函数预编译与执行顺序的关系
      

  9.   


    师兄,
     
    alert(t)  //为什么这里出错,,难道 只认 var?
    t = 1
      

  10.   


    alert(t)  //undefined
    var t = 1
    alert(t)  //为什么这个不是undefined  而是报错
    t = 1
      

  11.   

    js看来是先给变量分配内存在执行的,var表示给变量分配内存(加载页面初始化时),而没有var的再是临时创建的,这种变量用delete都会报错,也就是说这种变量是系统回收不必认为手动销毁的第一种可能是因为内存中确确实实存在的(因为初始化时候已经分配了),而第二种变量在alert时候根本内存中就没有它(因为是临时分配的)以上都是个人观点,希望对楼主有点用
      

  12.   


    看了楼上推荐的文章,说是 变量声明是在 预编译时声明的,而赋值是在代码执行时赋值的,那
    alert(t)
    var t = 1;
    就相当于?
    var t;
    alert(t)
    t = 1;而
    alert(t)
    t = 1; //仅仅是赋值 而没有声明?
    是不是这样理解?
      

  13.   

    alert(t)
    var t = 1;//这里将外面的同名变量屏蔽了,但是上面这个alert依然undefined,因为,虽然内存中存在,但是由于变量在alert下面,所以并不等同与下面的var t;
    alert(t)
    t = 1;而
    alert(t)
    t = 1; //这个在初始化时候根本就没有被考虑进去
      

  14.   


    师兄 
    var t = 1;//这里将外面的同名变量屏蔽了。
    这里没有什么外面里面的变量,我是举例,具体是 4楼那几个独立的代码段。你举的变量屏蔽一说,我感觉有些疑惑,
    我倒是觉得  变量声明是在预编译时声明的,而赋值是在代码执行时赋值的  这句话还理解些。
      

  15.   

    关于第3种情况,我觉得11楼的解释最为正确了。
    不过,12楼又提现了一个新的问题,alert(t) //为什么这里出错,,难道 只认 var?
    t = 1这个,谁能给个合理的解释呢?
      

  16.   

    你没用到var ,只有执行到他赋值的时候才会再声明成全局变量。