为什么这个说未定义?

时间:2013-08-20 01:56:43

标签: javascript html

<section id="clickme">
     <p>Stuff goes here.</p>
</section>


$("#clickme").on("click", function(){
    alert(this.innerHTML);
    setTimeout(function(){
                alert(this.innerHTML);
    }, 1000);
})

有谁知道为什么第二个警报未定义?

5 个答案:

答案 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);
})

Fiddle

答案 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指向windowwindow对象没有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
})