繁体   English   中英

Chrome上的Math.random()javascript函数* undefined *

[英]Math.random() javascript function *undefined* on Chrome

首先,我确信这是一个微不足道的问题,但我不明白为什么会这样,我无法在其他任何地方找到答案。 我用Google搜索我的问题但收效甚微,但是如果我错过了什么,只是浪费了你的时间,请指出我正确的方向并接受我谦虚的借口。

也就是说,这就是发生的事情。 我正在构建一个简单的脚本来显示由分布式算法(giraph)绘制的图形,我正在使用Linux。 我导入了所有库,特别是jQuery,一切都在Firefox(版本36.0.1)中工作。 切换到Chrome(版本41.0.2272.89(64位)),页面停止工作。 调查这个问题,我发现错误是在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 "";}

Chrome在MacOS X Mavericks上不会发生这种情况。 以前有人经历过这种行为吗?

编辑:不幸的是,我认为这不是命名空间冲突。 在我的库中,我只导入了另一个库(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)
    {}

})();

有些东西会覆盖代码中的Math

在Chrome控制台中执行Math 在其上执行上下文菜单,然后选择“显示功能定义”。 这可能会引导您进入“Sources”面板并显示正在覆盖它的脚本。

编辑:这是名为notscripts chrome扩展名。 禁用它。 以下是证明的源代码: webarchive

页面上的另一个库将覆盖Math对象。 这是污染全球命名空间的原因之一。

作为参考, Math应返回以下内容

在此输入图像描述

不知何故, NotScript自动安装在Ubuntu 16.04上的Chrome浏览器中。 这会在<html>标记之后插入您在更新中显示的脚本。

我不得不去设置,查看扩展,禁用NotScripts ,然后重启Chrome,它就会消失。

Chromium Extensions显示NotScripts 0.9.6已启用

在Ubuntu上,这必须是最近的,或者脚本最近更新了因为我在Chrome中运行完全相同的测试,几天前使用完全相同的脚本,并且它运行得很好。

有趣的是,看起来它在2年前 (2014 11月)被删除了,并且最近可能会重新添加?

我发现了另一种可能导致这种情况发生的情况。 我正在将PHP函数转换为JS函数,我有以下行:

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

把它改成

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

解决了这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM