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

浙公网安备 33010602011771号