可见性如何改变?

时间:2017-09-25 19:45:15

标签: javascript typescript

我有一个问题:



window.addEventListener("visibilitychange", function(e) {
  console.log(window.uidd)
  window.uidd = window.uidd || (new Date).getTime() + Math.random()
  console.log(window.uidd)
})




但是如果你打开控制台并且第一次得到:

undefined
124124214124124.124

window.uidd // undefined

为什么最后一个字符串是undefined

1 个答案:

答案 0 :(得分:1)

我必须只是因为我无法将评论附加到屏幕截图中才能得到答案,但我没有看到这种行为。

  1. 我确认window.uuid上不存在window变量。
  2. 我添加了事件监听器,并通过注册获得预期的第一个undefined
  3. 然后我点击标签的 out (第一个visibilitychange事件),获取第二个undefinedwindow.uuid的值集,两者都记录了来自听众。
  4. 我点击返回选项卡,触发第二个visibilitychange事件,并将uuid记录两次。
  5. 在控制台中键入window.uuid将返回全局uuid值。
  6. enter image description here

    我怀疑混淆可能在于你附加事件监听器的方式。

    编辑:

    使用以下测试页:

    <html>
    <head>
        <script>
            window.addEventListener("visibilitychange", function(e) {
                console.dir(window);
                console.log(window.uidd)
                window.uidd = window.uidd || (new Date).getTime() + Math.random()
                console.log(window.uidd)
            })
        </script>
    </head>
    <body></body>
    </html>
    

    我确实看到了这种行为。您需要使用this.uuid而不是window.uuid来访问该媒体资源,即使只是输入window也会显示.uuid媒体资源。

    奇怪的是,当我用静态分配替换你的测试时:

    window.addEventListener("visibilitychange", function(e) {
        window.foo = window.foo || "bar";
    })
    

    可以正常工作,我可以直接在控制台中看到window.foo的预期值。

    我也很好奇,asked the Chrome team。如果那里的某个人没有直接回答,我会更新这个答案。

相关问题