this的指向

参考地址:http://home.cnblogs.com/group/topic/69994.html

例1:因为下面有个定时器,所有指向的是全局的,setTimeout 无论在哪里,this指的都是window

var name = "Bob"; 
var nameObj ={ 
  name : "Tom", 
  showName : function(){ 
    alert(this.name);                           //BOb
  }, 
  waitShowName : function(){ 
    setTimeout(this.showName, 1000); 
  } 
};

nameObj.waitShowName();

如果想获取的名称为Tom,代码应该如下: 

在执行nameObj.waitShowName函数时,我们先对其this赋给变量that(这是为了避免setTimeout中的匿名函数运行时,

var name = "Bob";  
var nameObj ={  
    name : "Tom",  
    showName : function(){  
        alert(this.name);  
    },  
    waitShowName : function(){
        var that = this;
        setTimeout(function(){
            that.showName();
        }, 1000);
    }
}; 
 
 nameObj.waitShowName();  //Tom

),然后延迟运行匿名函数,执行that.showName,即nameObj.showName 

例2:

var someone = {
  name: "Bob",
  showName: function(){
    alert(this.name);
  }
};

var other = {
  name: "Tom",
  showName: someone.showName     //这句话等价于:showName:  function(){alert(this.name);}  这里的函数来自someone.showName, 所以this指的是当前other
}

other.showName();  //Tom

  

例3:

var name = "Tom";

var Bob = {

  name: "Bob",
  show: function(){
    alert(this.name);
  }
}

var show = Bob.show;        //这句话等价于:var show =  function(){alert(this.name);}  这里的函数来自BOb.show, 所以this指的是window 

show();            //Tom

  

例4:

var name = "window";

var Bob = {
  name: "Bob",
  showName: function(){
    alert(this.name);
  }
};

var Tom = {
  name: "Tom",
  showName: function(){
    var fun = Bob.showName;     //这句话等价于:var fun =  function(){alert(this.name);}  这里的函数来自BOb.showName, 因为这里重新var 了fun,所以作用域链已经断掉,重新指向了window
    fun();
  }
};

Tom.showName();  //window

  

 例5:eval函数,其执行时候似乎没有指定当前对象,但实际上其this并非指向window,因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去

var name = "window";

var Bob = {
    name: "Bob",
    showName: function(){
        eval("alert(this.name)");
    }
};

Bob.showName();    //Bob

  
原文地址:https://www.cnblogs.com/vivijs/p/3729782.html