簡體   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