我有一个代码,
var a= document.getElementById("demo");
a.onclick = function(){
alert(this.innerHTML)
setTimeout(function(){
alert(this.innerHTML)
},1000);
}
我从第一个警报语句得到正确的innerHTML值。但是我在第二个警报语句中得到了未定义的值。有人能解释一下吗?
因为在函数中有嵌套函数,在嵌套函数中this
关键字将指向窗口。
你可以这样写:
var a= document.getElementById("demo");
a.onclick = function(){
var that = this;
alert(this.innerHTML)
setTimeout(function(){
alert(that.innerHTML)
},1000);
}
或者,您可以使用bind方法:
var a= document.getElementById("demo");
a.onclick = function(){
//var that = this;
alert(this.innerHTML)
setTimeout(function(){
alert(this.innerHTML)
}.bind(this),1000); // now this refers to the clicked element
}
这是不正确的,setTimeout
中的this
范围为window
对象。您必须保存最后一个作用域并使用它。例如setTimeout:
var that = that
var a= document.getElementById("demo");
a.onclick = function(){
// save scope
var that = this;
alert(this.innerHTML)
setTimeout(function(){
// since this is a new function, the "this" refers to the window object.
alert(that.innerHTML) // changed "this" to "that"
},1000);
}