<section id="clickme">
<p>Stuff goes here.</p>
</section>
$("#clickme").on("click", function(){
alert(this.innerHTML);
setTimeout(function(){
alert(this.innerHTML);
}, 1000);
})
有谁知道为什么第二个警报未定义?
答案 0 :(得分:2)
this
更改。您可以通过代理this
(在其他地方保留它)来避免它:
var that = this;
setTimeout(function(){
alert(that.innerHTML);
}, 1000);
或使用bind
(有效地做同样的事情)。
答案 1 :(得分:2)
正如@jaeheung回答的那样:
setTimeout()是Window对象的一种方法。并且'this'指向没有innerHTML的Window。
只需创建一个变量来存储对象,这样就不存在冲突。
$("#clickme").on("click", function(){
var myObj = this;
alert(myObj.innerHTML);
setTimeout(function(){
alert(myObj.innerHTML);
}, 1000);
})
答案 2 :(得分:0)
setTimeout()是Window对象的一种方法。并且'this'指向没有innerHTML的Window。
答案 3 :(得分:0)
内部函数内的上下文发生变化。如果你想在其中使用目标,你需要在它之前设置一个等于this
的var,如下所示:
$("#clickme").on("click", function(){
alert(this.innerHTML);
var that = this;
setTimeout(function(){
alert(that.innerHTML);
}, 1000);
})
答案 4 :(得分:0)
您的代码相当于:
$("#clickme").on("click", function(){
alert(this.innerHTML); // `this` points to the event object (`section`)
window.setTimeout(function(){ // notice the 'window.'
alert(this.innerHTML); // `this` now points to `window`
}, 1000);
})
undefined
错误即将发生,因为this.innerHTML
会转换为window.innerHTML
,因为内部this
指向window
。 window
对象没有innerHTML
属性,因此会产生undefined
属性。
为了使用section
元素对象,您需要将其缓存在某个变量中:
$("#clickme").on("click", function(){
var _this = this; // cached
alert(_this.innerHTML); // use cached
setTimeout(function(){
alert(_this.innerHTML); // use cached
}, 1000);
})
或者,我不确定在IE中工作的方法是将其作为参数传递给setTimeout
:
$("#clickme").on("click", function(){
alert(this.innerHTML); // `this` points to the event object (`section`)
setTimeout(function(_this){ // notice the `_this` as a parameter
alert(_this.innerHTML); // `_this` now points to the argument
}, 1000, this); // pass it here
})