gpt4 book ai didi

javascript - 我可以阻止 Chrome 吃掉我的全局属性吗?

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:53 29 4
gpt4 key购买 nike

当您包含外部 JavaScript 文件时,iOS 上的 Chrome 似乎会创建一个 XMLHttpRequest 对象。似乎将此对象分配给标识符为 a 的全局变量,覆盖了您可能已经拥有的任何内容。

测试用例:

  • HTML 文件(test.html):

    <!-- ... -->
    <script>
    var a = 1; // Value is not important for this demonstration
    </script>
    <script src="test.js"></script>
    <!-- ... -->
  • 外部 JavaScript 文件(test.js):

    setTimeout(function () {
    document.write(a); // [object XMLHttpRequest]
    a.onreadystatechange = function () {
    document.write(a.readyState); // Alternates between "1" and "4"
    };
    }, 100);

XMLHttpRequest 似乎重复发出请求(到某个地方...通过代理路由设备连接和监视请求不会显示任何内容)和 onreadystatechange 事件处理程序重复执行。

一些更多的观察:

  • 这似乎只在页面加载后的某个时间发生(因此 setTimeout)
  • 当它确实发生时,还有一个 window.__gchrome_CachedRequest 属性
  • __gchrome_CachedRequest === a
  • 在旧版本的 iOS Chrome 中似乎没有发生(虽然不确定它首先出现在哪个版本中)

有没有人遇到过这个?有什么方法可以阻止它发生(注意...我无法重命名 a)?如果有人知道为什么它这样做,我很想知道。


更新

我刚刚注意到,这实际上也发生在内联脚本中,而不仅仅是在包含外部脚本时。我最初没有注意到这一点,因为我在那里没有调用 setTimeout。所以看起来它实际上只是总是在页面加载后的某个时间发生。

最佳答案

从我们在评论中的讨论来看,Chrome 似乎正在使用 with 语句在 window 属性之上放置一些它自己的东西。它可能这样做是因为这些属性通常不会被覆盖。延迟很可能是由于 Chrome 在页面开始加载后多久可以将自己的脚本注入(inject) UIWebView(iOS 上的浏览​​器被迫使用底层 UIWebView 对象而不是它们自己的引擎)。

如果所有这些猜测都是真的,那么有一个简单的解决方案,除了访问 window.a 而不是 a 或取回电源并使用你自己的 with 语句:

with (window)
eval(myScript);

几乎没有任何人愿意实现的解决方案,但可能是您唯一的选择。

关于javascript - 我可以阻止 Chrome 吃掉我的全局属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114308/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com