chrome中的意外全局变量有解决方案吗

Is there a solution to unexpected global variable in chrome

本文关键字:解决方案 全局变量 意外 chrome      更新时间:2023-09-26

我刚刚在脚本中发现chrome中的标记id被创建并存储在窗口对象上。

<script id="deploy" type="text/html">blah</script>

window.deploy=➜

<script id="deploy" type="text/html">blah</script>

Object.keys(window)不包括"部署"

显然不是新问题

所以我的问题

有没有人找到了解决这个问题的办法(防止铬污染我的世界)——这是我唯一想到的办法是以下内容:-

$('script[type="text/html"]').each ->
# stuff
delete window[@.getAttribute 'id']

当不在chrome中时,我的"解决方案"有删除全局变量的风险。

但是,如果没有我的解决方案,chrome可以在脚本id冲突时覆盖全局变量。

真是一团糟!

感谢您的帮助!

如果您使用id属性来命名HTML文档中的元素,并且Window对象还没有该名称的属性,则会为Window对象提供一个不可计数的属性,该属性的名称是id属性的值,其值是表示该文档元素的HTMLElement对象。

(我强调)

来源:JavaScript:最终指南,第6版

我想到了什么:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script id="deploy" type="text/html">blah</script>
    <script type="text/javascript">
        $(function () {
            $('script[type="text/html"]').each(function (index, element) {
                var id = $(element).attr('id');
                console.log(element);
                console.log(window[id]);
                if (window[id] === element) {
                    window[id] = undefined;
                }
                console.log(window[id]);
            });
        });
    </script>
</head>
<body>
</body>
</html>

这将检查全局是否与删除节点之前的节点相同。

请注意,这种情况发生在每个ID上,而不仅仅是script标签。正如Yoshi所说,它不应该污染你的全球范围,但上述解决方案应该对你有效。