在Chrome浏览器上,Math.random() Javascript函数返回undefined。

3
首先,我相信这是一个琐碎的问题,但我无法理解为什么会发生这种情况,也找不到答案。我在谷歌上搜索了一下我的问题,结果不佳,但如果我错过了什么并浪费了您的时间,请指出正确的方向并接受我的道歉。
说到具体情况,我正在构建一个简单的脚本来显示由分布式算法(giraph)绘制的图形,并在Linux上工作。我导入所有库,特别是jQuery,在Firefox(版本36.0.1)中一切正常。但是转到Chrome(版本41.0.2272.89(64-bit))时,页面停止工作。调查问题后,我发现错误位于jQuery库中的jQuery.extend()函数内,在以下行中:
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

事实上,尝试在浏览器控制台中调用Math.random()会导致:

> Math.random();
> Uncaught TypeError: Undefined is not a function

无论如何,在输入控制台时,会自动补全"Math"变量,并得到以下结果:
> Math
> function (){return "";}

这种情况在MacOS X Mavericks上使用Chrome时不会发生。有人之前遇到过这种行为吗?
编辑:不幸的是,我认为这不是命名空间冲突。在我的库中,我仅导入一个其他库(除了jQuery之外),即Sigma js。如建议所述,我在控制台中编写了Math并尝试了解哪个库覆盖了Math(使用“显示函数定义”),结果如下,取自名为“VM53”的文件(我没有直接编写或链接)。
(function (){
    for (var i in window)
    {
    try {
            var jsType = typeof window[i];
            switch (jsType.toUpperCase())
            {                   
                case "FUNCTION": 
                    if (window[i] !== window.location)
                    {
                        if (window[i] === window.open || (window.showModelessDialog && window[i] === window.showModelessDialog))
                            window[i] = function(){return true;};
                        else if (window[i] === window.onbeforeunload)   // To try to fix onbeforeunload pop ups some users report seeing but I can't replicate.
                            window.onbeforeunload = null;
                        else if (window[i] === window.onunload)
                            window.onunload = null;                             
                        else
                            window[i] = function(){return "";};
                    }
                    break;                          
            }           
        }
        catch(err)
        {}      
    }

    for (var i in document)
    {
        try {
            var jsType = typeof document[i];
            switch (jsType.toUpperCase())
            {                   
                case "FUNCTION":
                    document[i] = function(){return "";};
                    break;                  
            }           
        }
        catch(err)
        {}      
    }

    try {
        eval = function(){return "";};              
        unescape = function(){return "";};
        String = function(){return "";};
        parseInt = function(){return "";};
        parseFloat = function(){return "";};
        Number = function(){return "";};
        isNaN = function(){return "";};
        isFinite = function(){return "";};
        escape = function(){return "";};
        encodeURIComponent = function(){return "";};
        encodeURI = function(){return "";};
        decodeURIComponent = function(){return "";};
        decodeURI = function(){return "";};
        Array = function(){return "";};
        Boolean = function(){return "";};
        Date = function(){return "";};
        Math = function(){return "";};
        Number = function(){return "";};
        RegExp = function(){return "";};

        var oNav = navigator;
        navigator = function(){return "";};
        oNav = null;            
    }
    catch(err)
    {}

})();

这确实很有趣 :) - Piotr Dajlido
5
某些脚本覆盖了 Math.random。尝试从页面中删除其他 <script> 标记并查看是什么导致了错误。 - Ginden
或者Chrome扩展程序因某种原因禁用了“Math”。如果您尝试在隐身模式下进行操作,它是否有效? - JJJ
Math.random() 是原生 JavaScript 代码,所以我能想到的唯一可能是在你的代码中某处覆盖了 Math 对象。 - Roumelis George
4个回答

11

有些东西在您的代码中覆盖了 Math

在您的Chrome控制台中执行 Math。在其上执行上下文菜单,然后选择“显示函数定义”。这可能会导致您进入“源”面板并显示脚本在哪里被覆盖。

编辑: 这是一个名为notscripts的Chrome扩展程序。请禁用它。以下是证明的源代码:webarchive


如果一切正常,你找到了这个东西的作者,请在GitHub上建立信任关系,获取他的家庭地址,找到一些非常重的东西,并向这个混蛋展示覆盖语言确实是一个坏主意 =) - Boris Zagoruiko
就像我说的那样,我知道这是一些微不足道的东西 戴上耻辱锥形帽 - Alessio Arleo
Glen,链接现在已经失效了。我建议现在将它指向这里:https://code.google.com/archive/p/notscripts/。 - Alexis Wilke
@AlexisWilke 感谢您指出这一点。我已经用Webarchive缓存副本替换了链接。 - Boris Zagoruiko

2

你的页面上另一个库正在覆盖 Math 对象。这是“污染”全局命名空间的原因之一,所以应该避免这样做。

参考文献中,Math 应返回以下内容:

enter image description here


1
我发现另一种可能导致这种情况发生的情况。我正在将一个PHP函数转换为JS函数,我有以下行:
ticks += "," . Math.floor(yyy * intMax);

将其更改为

ticks += "," + Math.floor(yyy * intMax);

问题已解决


1
那真的与问题无关。Math.random() 明显是 JavaScript 函数,它应该在很长一段时间内继续工作。 - Alexis Wilke

0
一些奇怪的事情发生了,NotScript 自动安装在我的 Ubuntu 16.04 上的 Chrome 浏览器中。它会在 <html> 标签后面插入你更新中展示的脚本。
我不得不进入设置,查看扩展程序,禁用 NotScripts,然后重新启动 Chrome 才能将其删除。

Chromium Extensions showing NotScripts 0.9.6 enabled

在Ubuntu上,这一定是非常近期的,或者脚本最近被更新了,因为我几天前在Chrome中运行了完全相同的测试,使用完全相同的脚本,它正常工作。
有趣的是,看起来它可能是2年前被移除(2014年11月),最近重新添加?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接