Javascript 两个事件处理程序分配之间的差异

Javascript 两个事件处理程序分配之间的差异,javascript,Javascript,假设我们有一个包含一个脚本的简单html页面: <html> <script type="text/javascript"> window.onpopstate=function(event) { alert("hi"); } </script> <body > <h1> Hi, 2 </h1> <a href="h3.htm">next</a> </body> &l

假设我们有一个包含一个脚本的简单html页面:

<html> 
<script type="text/javascript"> 
window.onpopstate=function(event) 
{   alert("hi"); } 
</script> 
<body > 
<h1> Hi, 2 </h1> 
<a href="h3.htm">next</a> 
</body> 
</html>

window.onpopstate=函数(事件)
{alert(“hi”);}
嗨,2
它不工作(我在Chrome和FF下尝试过)。但是当我编写脚本代码时

<script type="text/javascript"> 
function pp(event) {      alert("hi");    }
window.onpopstate=pp()
</script> 

函数pp(事件){alert(“hi”);}
window.onpopstate=pp()
它起作用了!对我来说,这两段代码只是在函数定义上有所不同,但在实践中并不相同


顺便说一句,即使触发onpopstate事件,事件也未定义。这对我来说是一件更不清楚的事情。谢谢你的帮助。

正如@Sampson所说。。他们不一样

在第二个示例中,
window.onpopstate
正在填充执行
pp
结果。在本例中,此函数返回undefined,因此
窗口。在此之后,onpopstate
是未定义的。当然,您会看到
警报
,但是
窗口。onpopstate
未定义的

在第一个示例中,
window.onpopstate
由函数本身填充,这是实际需要的。如果您看到,
onpopstate
需要一个
funcRef
,这正是您作为参数传入的内容


底线:在第二个示例中,您会看到
警报
,因为您正在调用函数,但第一个是正确的。为了实际查看被触发的
onpopstate
,您应该将其添加到浏览器历史记录中,但这是另一个故事…

首先在第二个代码片段中,您有函数调用
pp()
,您可能需要
窗口。onpopstate=pp


其次,当您手动执行
history.pushState({page:1},“title 1”,“page=1”)时,它会起作用
然后
history.back()或只需单击“上一步”按钮。不知道为什么单击链接不会在历史记录中添加条目。

第二个示例立即执行
pp
,试图将返回值(本例中未定义)分配给
窗口。onpopstate
。两者都不使用,
目标。addEventListener(类型,处理程序)
是您的目标friend@Sampson,现在对我来说更清楚了,谢谢@保罗S,谢谢你,我明天会试着做:)是的,关于“另一个故事”你是对的-从我的角度看,看起来我是一个小哈比人,但现在我正处在一个重大事件的中心:)