以下是我的理解  仅参考function show(){
    this.a="1";//这里的this不一定指的是bb 是泛指 只要调用了这个方法  默认的调用者就是this
    alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"   因为此处只定义了 a 其它的还为定义。
    show2();
    function show2(){
      this.b="2";
      alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......        (因为这里的a是调用show2者的 故现在还不存在,应该是bb.a就应该有了吧。这时show2只是函数,其它的类似)
      show3();
      function show3(){
        this.c="3";
        alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
        show4();
        function show4(){
          this.d="4";
          alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
        }
      }
    }
  }
  var bb=new show();
如果你想让它显示 
1undefinedundefinedundefined
12undefinedundefined
123undefined
1234那么把最后一句改成show();吧
这样就都是函数调用了.....

解决方案 »

  1.   

    代码虽然比较多,但仔细看其实只是a没有显示出来,应该是因为闭包问题。忘了在什么地方看过,函数式语言是这样的,因为不能保证在show执行完之后,没有其他地方还在用show2,所以内部的还存在<script language="javascript">
    function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        show2();
        function show2(){
          this.b="2";
          alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
          show3();
          function show3(){
            this.c="3";
            alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
            show4();
            function show4(){
              this.d="4";
              alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
              show5();
            function show5(){
              this.e="5";
              alert(this.a+this.b+this.c+this.d+this.e);//显示 "undefined234" 为什么 this.a 都是 undefined 
            }
            }
          }
        }
      }
      var bb=new show();
    </script>
      

  2.   


    function show(){
    this.a="1";//我的理解是 这里的 this 指bb
    alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
    show2();
    function show2(){
    this.b="2";
    alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
    show3();
    function show3(){
    this.c="3";
    alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
    show4();
    function show4(){
    this.d="4";
    alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
    }
    }
    }
    }
    var bb=new show();this.a 为实力bb
    其余滴都是全局对象Global滴see:
      

  3.   


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
      <META NAME="Generator" CONTENT="EditPlus">
      <META NAME="Author" CONTENT="">
      <META NAME="Keywords" CONTENT="">
      <META NAME="Description" CONTENT="">
     </HEAD> <BODY>
      <SCRIPT LANGUAGE="JavaScript">
      <!--
    function show(){
    this.a="1";//我的理解是 这里的 this 指bb
    alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
    show2();
    function show2(){
    this.b="2";
    alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
    show3();
    function show3(){
    this.c="3";
    alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
    show4();
    function show4(){
    this.d="4";
    alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
    }
    }
    }
    }
    var bb=new show();
    alert("-----------------" + this.a+this.b+this.c+this.d);
      //-->
      </SCRIPT>
     </BODY>
    </HTML>
      

  4.   

    bind一下就好<script language="javascript">Function.prototype.bind = function(object) {
      var __method = this, args = Array.apply(null, arguments); args.shift();
      return function() {
        return __method.apply(object, args);
      }
    }
    function show(){
    this.a="1";//我的理解是 这里的 this 指bb
    alert(this.a+this.b);//显示"1undefinedundefinedundefined"

    var show2 = function (){
      this.b="2";
      alert(this.a+this.b);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
    }.bind(this)

    show2();
    }
    var bb=new show();
    </script>
      

  5.   

    或者这样
    function show(){
    var oThis = this
    this.a="1";//我的理解是 这里的 this 指bb
    alert(this.a+this.b);//显示"1undefinedundefinedundefined"
    show2();
    function show2(){
      oThis.b="2";
      alert(oThis.a+oThis.b);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
    }
    }
    var bb=new show();
      

  6.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    </head>
    <body>
    <script type="text/javascript">
    function show()
    {
    this.a="1";
    window.a = "1";//这样,后面就能显示this.a了(后三个this实际指向window)
        alert(this.a+"  "+this.b+"  "+this.c+"  "+this.d);
        if(this.alert)//因为alert实际是window.alert,所以可以用来判断是不是指向window
         alert("show的this指向window");
        show2();
        function show2()
        {
    this.b="2";
    alert(this.a+"  "+this.b+"  "+this.c+"  "+this.d);
    if(this.alert)
         alert("show2的this指向window");
    show3();
    function show3()
    {
             this.c="3";
             alert(this.a+"  "+this.b+"  "+this.c+"  "+this.d);
             if(this.alert)
         alert("show3的this指向window");
             show4();
             function show4()
             {
               this.d="4";
               alert(this.a+"  "+this.b+"  "+this.c+"  "+this.d);
               if(this.alert)
         alert("show4的this指向window");
             }//end show4
           }//end show3
        }//end show2
    }//end showvar bb=new show();/*
    结果可以看到,除了1,后面的this,指向的其实是window,在window作用域下,a当然是不存在的,所以后面三句,a一直是undefined
    */
    </script>
    </body>
    </html>
      

  7.   

    var c = 5function b(){
        this.c = "c";
    (function(){alert(this.c)})();
    }new b()试试就明白
      

  8.   

    至于后三个this为什么指向的是window,这是JS规定的,没有指向特定对象的,像是一般的函数,其中的this指向的就是window
      

  9.   

      因为在 javascript 内存访问机制中 实例化的对象成员与非实例化成员这间不能互相访问:
      如this.a 是实例化对象的成员,而 this.b...this.d 者是非实例化成员 ,因此 this.b...this.d 变量
    都无法访问this.a 而由于它们之间都是  非实例化成员,所以它们之间可以互访.
     所以得出的结果是:
     "1undefinedundefinedundefined"
     "undefined2undefinedundefined"
     "undefined23undefined"
     "undefined234"
      

  10.   


    可以改一下。
    Function.prototype.bind = function(object) 
    {
      var method=this;
      return function() {
        method.apply(object, arguments);
      }
    }
      

  11.   

    [JScript]
    function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        show2();//实际为window.show2();
        function show2(){
          this.b="2";//这个b为window.b;//因为a是另一个实例的,在该函数内和window对象中都找不到该变量,所以为undefine
          alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
          show3();//实际为window.show3();
          function show3(){
            this.c="3";//window.c;在window对象中找到变量b
            alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
            show4();
            function show4(){
              this.d="4";//window.d;
              alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
            }
          }
        }
      }
      var bb=new show();
    [/JScript]
      

  12.   

    javascript中的this区别于c++、java等编译型语言。
    C++中的this是指对象的本身

    javascript中的this是没有规定指向谁的。function show(){
        this.a="1";
    }
    var bb=new show();//这时this就指向 bb
    show();//这时this就指向了window对象一般没有为函数指定调用者时,this指的都是全局对象(window)对象。
      

  13.   

    楼主this的作用域要搞清楚啊show2里面的this自然就是指向show2的,它把show的this隐藏了。可以用在show里面show2外面用_this=this;保存this指针。然后在show2里面用_this.
      

  14.   

    用绑定虽然结果是正常,但感觉偏离了原来代码的意义,还是这种吧:function show(){
        var _this = this
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b);
        show2();
        function show2(){
          _this.b="2";
          alert(_this.a+_this.b);
        }
    }
    var bb=new show();
      

  15.   

    很显然的this修正问题,请记住每一个function都是一个class
      

  16.   

    我为楼主换种写法:
    function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        this.show2 = function (){
          this.b="2";
          alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
          this.show3=function (){
            this.c="3";
            alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
            this.show4=function (){
              this.d="4";
              alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
            }
            this.show4();
          }
          this.show3();
        }
        this.show2();
      }
      var bb=new show();
      

  17.   


    function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        show2();
        function show2(){
            this.b="2";
            alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
            show3();
            function show3(){
                this.c="3";
                alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
                show4();
                function show4(){
                    this.d="4";
                    alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
                }
            }
        }
    }
    var bb=new show();
    个人理解:谨记这句话关键字this总是指向调用该方法的对象
    所以这里的第一个this应该都是指向bb
    这样一来,就只有一点疑问
    就是为什么其他的this.a都是undefined我们分析下this.a 是在方法里赋值的
    而其他的都是在bb的内部的方法里定义的
    这就是他们的差别,那么还有其他的差别吗?(可以再找找)
    好了 找到一点差别 那我们就从这个差别入手我们在把这断代码改改,如下:function show2(){
            this.b="2";
            alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
            show3();
            function show3(){
                this.c="3";
                alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
                show4();
                function show4(){
                    this.d="4";
                    alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
                }
            }
        }
        function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        show2();    
    }
    var bb=new show();结果和原来的一样
    这样 我想大家就豁然开朗了
    show2()下面的this表示的是show2()这个对象,或者说是传递给它的对象
    所以以后的this.a 没有赋值,自然不存在然后你又会有疑问,你会问 那按照你说的 应该结果是如下:显示"1undefinedundefinedundefined"
    显示 "undefined2undefinedundefined" 
    显示 "undefinedundefined3undefined" 
    显示 "undefinedundefinedundefined4" 别忘了你只实例化一个函数就是show()
    试着把这个几个函数按照上面的方法分解
    然后逐个实例化
    看看结果会是如何
      

  18.   


    function show3(){
                this.c="3";
                alert(this.a+this.b+this.c+this.d);//显示 "undefined23undefined" 这里 为什么 不是 "undefinedundefined3undefined"
                show4();            
            }
        function show4(){
                    this.d="4";
                    alert(this.a+this.b+this.c+this.d);//显示 "undefined234" 为什么 this.a 都是 undefined 
                }
        function show2(){
            this.b="2";
            alert(this.a+this.b+this.c+this.d);// 显示 "undefined2undefinedundefined" 为什么 this.a 是 undefined ......
            show3();        
        }
        function show(){
        this.a="1";//我的理解是 这里的 this 指bb
        alert(this.a+this.b+this.c+this.d);//显示"1undefinedundefinedundefined"
        show2();
        
    }
    var bb=new show();
    var bb2=new show2();
    var bb3=new show3();
    var bb4=new show4();
    每个对象都只有自己的一个属性分别是a,b,c,d
    结果是 show():this.a=1
    show2():this.b=2
    show3():this.c=3
    show4():this.d=4这样或许你就明白了
      

  19.   

    ls的想复杂了吧
    我也没看懂其实show2之后的this就是window本身了
    这样应该容易理解点
    程序实际上是var a="wina",b="winb",c="winc"function show(){
    this.a="1";//我的理解是 这里的 this 指bb
    show2();
    function show2(){
    b="2";
    show3();
    function show3(){
    c="3";
    }
    }
    }var bb=new show();alert(a+b+c)这样或许容易理解点
    实际上是修改了window的b c