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

In primo luogo, sono convinto che questa è una domanda banale, ma non riesco a capire perché questo stia accadendo e non sono riuscito a trovare una risposta altrove. Ho cercato su Google il mio problema con scarso successo, ma se mi fossi perso qualcosa e avessi perso il tuo tempo per favore indicami la giusta direzione e accetta le mie umili scuse.

Detto questo, ecco cosa succede. Sto costruendo un semplice script per visualizzare un grafico disegnato da un algoritmo distribuito (giraph) e sto lavorando su Linux. Importa tutte le librerie e, in particolare, jQuery e tutto funziona in Firefox (versione 36.0.1). Passando a Chrome (versione 41.0.2272.89 (64-bit)), la pagina smette di funzionare. Analizzando il problema, ho scoperto che l’errore era all’interno della funzione jQuery.extend() nella libreria jQuery, nella seguente riga:

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

Infatti, provare ad invocare Math.random() nella console del browser porta a:

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

Ad ogni modo, mentre si digita la console, la variabile “Math” viene completata automaticamente, con il seguente risultato:

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

Questo non succede con Chrome su MacOS X Mavericks. Qualcuno aveva già sperimentato questo tipo di comportamento?

EDIT: Purtroppo, non penso che questo sia un conflitto nello spazio dei nomi. Nella mia libreria importa solo un’altra libreria (diversa da jQuery), che è Sigma js . Come suggerito, ho scritto Math nella console e ho cercato di capire quale libreria ha sovrascritto Math (usando “Show Function Definition”), con il seguente risultato, preso da un file chiamato “VM53” (che non ho scritto e / o collegato direttamente).

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

Qualcosa ha la precedenza su Math nel tuo codice.

Esegui Math nella tua console di Chrome. Esegui il menu di scelta rapida e seleziona “Mostra definizione della funzione”. Questo probabilmente ti porterà al pannello “Sorgenti” e mostrerà lo script in cui viene sovrascritto.

EDIT: questa è l’estensione chrome chiamata notscripts . Disabilitalo. Ecco il codice sorgente per la prova: webarchive

Un’altra libreria sulla tua pagina sta sovrascrivendo l’object Math . Questo è uno dei motivi per cui l’ inquinamento del Global Namespace è disapprovato.

Per riferimento Math dovrebbe restituire quanto segue

inserisci la descrizione dell'immagine qui

In qualche modo, NotScript è stato installato automaticamente nel mio browser Chrome su Ubuntu 16.04. Questo inserisce lo script che mostri nel tuo aggiornamento subito dopo il tag .

Dovevo andare alle impostazioni, guardare le estensioni, disabilitare i NotScripts e quindi riavviare Chrome per farlo sparire .

Estensioni Chromium che mostrano NotScripts 0.9.6 abilitato

Su Ubuntu, questo deve essere molto recente o lo script è stato aggiornato di recente perché ho eseguito lo stesso identico test in Chrome, con gli stessi script, pochi giorni fa, e funzionava perfettamente.

Abbastanza interessante, sembra che sia stato rimosso 2 anni fa (novembre 2014) e forse riaggiunto di recente?

Ho trovato un’altra situazione che potrebbe causare che ciò accada. Stavo convertendo una funzione PHP in una funzione JS e avevo la seguente riga:

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

Cambiandolo a

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

problema risolto