var part = "global";
 function checkvariable()
{
 document.write(part);
 document.write("sf");  
}
 checkvariable();  //输出global var part = "globa";
function checkvariable()
{  
  alert(part);
  var part = "local";
  document.write(part);
}
checkvariable();
为什么输出是两次 undefined和local。恳求详细解释一下javascript 作用域

解决方案 »

  1.   

    function checkvariable()
    {  
      alert(part);
      var part = "local";
      document.write(part);
    }在javascript中是先执行 var部分,再执行别的,所以这里的alert(part);指向的是内部对象part而不是全局对象part
      

  2.   

    作用域问题很简单,记住 
    同一片作用域相同的变量就是同一个变量(不用管该变量定义在什么位置定义了几次)
    还有,一般来说,只有函数又单独作用域,像if,for,switch什么的都没有独立作用域的
      

  3.   

    alert(part)时,checkvariable作用域里会先检查part是否在这个作用域中定义,检查到作用域内有定义但在alert的后面,所以输出undefinded
      

  4.   

    但是代码执行应该有先后顺序啊,麻烦就两次输出再给一点解释。谢谢
    正是因为执行顺序导至alert是undefined
    你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
    至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
    比如:
    var p = 1;
    function test(){
        if(false) {
           var p;
        }
        p = 2;
    }
    test();
    alert(p);
    看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
      

  5.   

    但是代码执行应该有先后顺序啊,麻烦就两次输出再给一点解释。谢谢
    正是因为执行顺序导至alert是undefined
    你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
    至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
    比如:
    var p = 1;
    function test(){
        if(false) {
           var p;
        }
        p = 2;
    }
    test();
    alert(p);
    看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
    那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
      

  6.   

    但是代码执行应该有先后顺序啊,麻烦就两次输出再给一点解释。谢谢
    正是因为执行顺序导至alert是undefined
    你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
    至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
    比如:
    var p = 1;
    function test(){
        if(false) {
           var p;
        }
        p = 2;
    }
    test();
    alert(p);
    看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
    那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
    你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
      

  7.   

    但是代码执行应该有先后顺序啊,麻烦就两次输出再给一点解释。谢谢
    正是因为执行顺序导至alert是undefined
    你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
    至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
    比如:
    var p = 1;
    function test(){
        if(false) {
           var p;
        }
        p = 2;
    }
    test();
    alert(p);
    看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
    那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
    你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
    呵呵,其实上面那段程序(全部),放在js标签里执行不报错。具体输出是1:弹框undefined,浏览器上显示了一个local;2:再次弹出undefined,浏览器上追加了一个local。我就想知道这其中的原因,是第二次函数定义覆盖了第一次还是怎么回事。从c的角度解释不通,本人原来学c.
      

  8.   

    其实有件事很郁闷,大家一直避而不谈两次。答得不错,非所问。 var part = "globa";
    function checkvariable()
    {  
      alert(part);//第一次输出undefinded   在上面我已经解释清楚了
      var part = "local";//这里重新定义了part
      document.write(part);//这里输出local
    }
    checkvariable();
    所以第一次输出undefinded  第二次输出local。
    还有  不要在script里用两个同名函数
      

  9.   

    其实有件事很郁闷,大家一直避而不谈两次。答得不错,非所问。 var part = "globa";
    function checkvariable()
    {  
      alert(part);//第一次输出undefinded   在上面我已经解释清楚了
      var part = "local";//这里重新定义了part
      document.write(part);//这里输出local
    }
    checkvariable();
    所以第一次输出undefinded  第二次输出local。
    还有  不要在script里用两个同名函数
    我贴的代码就在上面,不要断章取义,一叶障目不见森林啊亲。我要的就是定义同名函数,因为不报错,所以想看是什么原因。进而窥测其运行机制。
      

  10.   

    但是代码执行应该有先后顺序啊,麻烦就两次输出再给一点解释。谢谢
    正是因为执行顺序导至alert是undefined
    你先认定alert的part与下面var定义的part是同一个变量,那么显然alert时part并没有赋值,不就是undefined么?
    至于原理就是变量定义会提前,你可以认为同一片域中变量定义在执行之前
    比如:
    var p = 1;
    function test(){
        if(false) {
           var p;
        }
        p = 2;
    }
    test();
    alert(p);
    看似定义永不会发生,但实际是发生了,函数定义了一个局部的p,结果是全局的p不变
    那为什么是两次相同的输出呢,我想就想知道这一点。目测照你说的顺序, 那第一次调用函数的时候,跟下面应该没关系吧。
    你写清楚哪儿输出了undefined,还有不要用document.write来输出,用alert或console.log
    呵呵,其实上面那段程序(全部),放在js标签里执行不报错。具体输出是1:弹框undefined,浏览器上显示了一个local;2:再次弹出undefined,浏览器上追加了一个local。我就想知道这其中的原因,是第二次函数定义覆盖了第一次还是怎么回事。从c的角度解释不通,本人原来学c.
    是的,function(){}方式既是函数定义又是赋值,所以会提前执行
    如果放到两个不同script标签中因为标签加载先后前面一个可以执行
    放到同一个标签中则是后面一个覆盖前一个
    至于机制这种东西,不好明确,很多时候看浏览器:
    if(true) {
        function test(){
            alert(1);
        }
    } else {
        function test(){
            alert(2);
        }
    }
    test();
    大部分浏览器会输出2,火狐输出1;机制自己去想吧
      

  11.   

    可以解释通,有没有相关的文章推荐一下,我再看一下这一块呢。
    你看mozilla 里关于function一些 说明
    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Functions