Javascript 为什么这个说的是未定义的?

Javascript 为什么这个说的是未定义的?,javascript,html,Javascript,Html,有人知道为什么第二个警报未定义吗?这会发生变化。只需将其代理到其他地方即可避免: <section id="clickme"> <p>Stuff goes here.</p> </section> $("#clickme").on("click", function(){ alert(this.innerHTML); setTimeout(function(){ alert(this.i

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

这会发生变化。只需将其代理到其他地方即可避免:

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


$("#clickme").on("click", function(){
    alert(this.innerHTML);
    setTimeout(function(){
                alert(this.innerHTML);
    }, 1000);
})
或者通过使用bind,它可以有效地完成相同的任务。

这会发生变化。只需将其代理到其他地方即可避免:

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


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

或者通过使用bind有效地完成同样的事情。

setTimeout是一种窗口对象的方法。“this”指向没有innerHTML的窗口。

setTimeout是一种窗口对象的方法。“this”指向没有innerHTML的窗口。

内部函数中的上下文会发生变化。如果要在其中使用目标,需要在其之前设置一个等于此的var,如下所示:

var that = this;
setTimeout(function(){
            alert(that.innerHTML);
}, 1000);

上下文在内部函数中发生变化。如果要在其中使用目标,需要在其之前设置一个等于此的var,如下所示:

var that = this;
setTimeout(function(){
            alert(that.innerHTML);
}, 1000);

正如@jaeheung所回答的:


setTimeout是窗口对象的一种方法。“this”指向没有innerHTML的窗口

只需创建一个变量来存储对象,这样就不会有冲突

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

正如@jaeheung所回答的:


setTimeout是窗口对象的一种方法。“this”指向没有innerHTML的窗口

只需创建一个变量来存储对象,这样就不会有冲突

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

您的代码相当于:

$("#clickme").on("click", function(){
    var myObj = this;
    alert(myObj.innerHTML);
    setTimeout(function(){
                alert(myObj.innerHTML);
    }, 1000);
})
未定义的错误即将出现,因为this.innerHTML转换为window.innerHTML,因为内部this指向window。窗口对象没有innerHTML属性,因此会导致未定义的属性

为了使用section元素对象,您需要将其缓存在某个变量中:

$("#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);
})
或者,我不确定在IE中是否有效的方法是将其作为参数传递给setTimeout:


您的代码相当于:

$("#clickme").on("click", function(){
    var myObj = this;
    alert(myObj.innerHTML);
    setTimeout(function(){
                alert(myObj.innerHTML);
    }, 1000);
})
未定义的错误即将出现,因为this.innerHTML转换为window.innerHTML,因为内部this指向window。窗口对象没有innerHTML属性,因此会导致未定义的属性

为了使用section元素对象,您需要将其缓存在某个变量中:

$("#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);
})
或者,我不确定在IE中是否有效的方法是将其作为参数传递给setTimeout:


非常感谢你!你能再解释一下吗?我对此一无所知…你的setTimeoutfunction{…实际上是window.setTimeoutfunction的缩写{….并且函数注册为窗口对象的事件处理程序。当事件被触发时,它与您的clickme对象无关,但实际上是窗口对象执行函数中的代码。因此“this”必须指向窗口对象。非常感谢!您能再解释一下吗?我很抱歉一个noob…你的setTimeoutfunction{…实际上是window.setTimeoutfunction的缩写{….并且函数被注册为窗口对象的事件处理程序。当事件被触发时,它与您的clickme对象无关,但实际上是窗口对象执行函数中的代码。所以“this”必须指向窗口对象。但是为什么它给了我一个未定义的结果?@PenghanYang:因为在集合内部超时处理程序,这是窗口,因为setTimeout实际上是window.setTimeout;所以this.innerHTML是window.innerHTML,这不是您想要的。@彭汉阳,这里有一些很好的参考资料供您了解更多有关javascript上下文的信息。谢谢!非常感谢您为我提供这些参考资料。非常感谢!但为什么它给了我未定义的结果?@PenghanYang:因为在setTimeout处理程序中,这是窗口,因为setTimeout实际上是window.setTimeout;所以this.innerHTML是window.innerHTML,这不是您想要的。@PenghanYang,这里有一些很好的参考资料供您了解更多关于javascript上下文的信息。谢谢您!非常感谢您为我提供了软管参考。非常感谢!