简体   繁体   中英

Math.random() javascript function *undefined* on Chrome

In first place, I am convinced that this is a trivial question, but I cannot understand why this is happening and I couldn't find an answer anywhere else. I googled my issue with little success, but if I missed something and just wasted your time please point me in the right direction and accept my humble excuses.

That said, here is what happens. I am building a simple script to display a graph drawn by a distributed algorithm (giraph) and I am working on Linux. I import all the libraries and, in particular, jQuery and everything works in Firefox (version 36.0.1). Switching to Chrome (version 41.0.2272.89 (64-bit)), the page stops working. Investigating the issue, I found out that the error was inside the jQuery.extend() function into the jQuery library, at the following line:

expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

In fact, trying to invoke Math.random() into the browser console leads to:

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

Anyway, while typing the console autocompletes the "Math" variable, with the following result:

> Math
> function (){return "";}

This does not happen with Chrome on MacOS X Mavericks. Did anybody experience this kind of behaviour before?

EDIT: Unfortunately, I don't think that this is a namespace conflict. In my library I import only one other library (other than jQuery), which is Sigma js . As suggested, I wrote Math in the console and tried to understand which library did override Math (using "Show Function Definition"), with the following result, taken from a file named "VM53" (which I did not write and/or linked directly).

(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)
    {}

})();

Something overrides Math in your code.

Execute Math in your chrome console. Execute context menu on it and select "Show function definition". This will probably lead you to "Sources" panel and show script where it is being overriden.

EDIT: this is chrome extension called notscripts . Disable it. Here is the source code for proof: webarchive

Another library on your page is overriding the Math object. This is one of the reasons that polluting the Global Namespace is frowned upon.

For reference Math should return the following

在此输入图像描述

Somehow, NotScript got automatically installed in my Chrome browser on Ubuntu 16.04. That inserts the script you show in your update just after the <html> tag.

I had to go to the settings, look at the extensions, disable the NotScripts and then restart Chrome to it would be gone.

Chromium Extensions显示NotScripts 0.9.6已启用

On Ubuntu, this must be very recent or the script got updated recently because I ran the exact same test in Chrome, with the exact same scripts, a few days ago, and it was working just fine.

Interestingly enough, it looks like it was removed 2 years ago (Nov 2014) and maybe re-added recently?

I found another situation that could cause this to happen. I was converting a PHP function to a JS function and I had the following line:

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

Changing it to

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

solved the problem

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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