参考地址: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