var o = {
                x: 10,
                doIt: function doIt() {
                    var x = 20;
                    alert(x);
                    alert(this.x);
                    setTimeout(function() {
                        alert(this.x);
                    }, 10);
                }
            };
            o.doIt();
第一个弹出20,第二个弹出10都好理解,请问为什么最后一个是undefined。谢谢!

解决方案 »

  1.   

      x="111"//这个加上看看
      var o = {
      x: 10,
      doIt: function doIt() {
      var x = 20;
      alert(x);
      alert(this.x);
      setTimeout(function() {
    alert(this.x)//这里的this,以经不是o这个对象了,是顶层的window对象,window对象下没有 x属性,自然弹出undefined了
      }, 10);
      }
      };
      o.doIt();  
      

  2.   

    Function.prototype.bind= function(x)
    {
       var f = this;
        return function()
        {
            f.call(x)
        }
    }
      
      var o = {
      x: 10,
      doIt: function doIt() {
      var x = 20;
      alert(x);
      alert(this.x);
      setTimeout(function() {
    alert(this.x)
      }.bind(this), 10);
      }
      };
      o.doIt();
    或者这样,改变方法调用的对象
      

  3.   

    setTimeout(function() {
    alert(this.x);
    }, 10)这里的this代表的是当前的function,可是当前function并没用x这个属性,要想用到你需要如此: setTimeout(function(x) {
    alert(x);
    }, 10)
      

  4.   

    3楼的有道理。4楼的好像有问题,this好像代表的不是当前的function。因为我改成var o = {
      x: 10,
      doIt: function doIt() {
      var x = 20;
      setTimeout(function() {
      alert(this);
      }, 10);
      }
      };
      o.doIt();弹出的是[object window]
      

  5.   

    this 指向改变了。谁调用指向谁
      

  6.   

      setTimeout(function() {
    alert(this.x)//这里的this,以经不是o这个对象了,是顶层的window对象,window对象下没有 x属性,自然弹出undefined了
      }, 10);
    那这里为什么是window调用它呢?function(){}是个匿名函数,感觉没人调用它?
      

  7.   

    http://topic.csdn.net/u/20070604/13/22753f84-3634-478e-aed3-f5dfe8958153.html
      

  8.   

    又试了一下,
                function a() { alert(this) }
                a();
    定义一个函数,alert(this)的结果就是[object window]