首先,我确信这是一个微不足道的问题,但我无法理解为什么会这样,我无法在其他任何地方找到答案。我搜索了我的问题但收效甚微,但是如果我错过了什么,只是浪费了你的时间,请指出我正确的方向并接受我卑微的借口。
那就是说,这就是发生的事情。我正在构建一个简单的脚本来显示由分布式算法(giraph)绘制的图形,我正在使用Linux。我导入了所有库,特别是jQuery,一切都在Firefox(版本36.0.1)中工作。切换到Chrome(版本41.0.2272.89(64位)),页面停止工作。调查这个问题,我发现错误是在jQuery.extend()
函数内部进入jQuery库,位于以下行:
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
事实上,尝试在浏览器控制台中调用Math.random()
会导致:
> Math.random();
> Uncaught TypeError: Undefined is not a function
无论如何,在键入控制台的同时,自动填充"数学"变量,结果如下:
> 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)
{}
})();
答案 0 :(得分:10)
代码中的某些内容会覆盖Math
。
在Chrome控制台中执行Math
。在其上执行上下文菜单,然后选择"显示功能定义"。这可能会引导你进入"来源"面板和显示正在覆盖它的脚本。
编辑:这是名为notscripts
的Chrome扩展程序。禁用它。以下是证明的源代码:webarchive
答案 1 :(得分:2)
页面上的另一个库会覆盖Math
对象。这是污染全局命名空间的原因之一。
供参考Math
应返回以下内容
答案 2 :(得分:0)
不知何故, NotScript 在我的Chrome浏览器中自动安装在Ubuntu 16.04上。这会在<html>
标记之后插入您在更新中显示的脚本。
我必须转到设置,查看扩展程序,停用 NotScripts ,然后重启Chrome,它就会消失。
在Ubuntu上,这一定是非常新的,或者脚本最近更新了,因为我在Chrome中使用完全相同的脚本运行了完全相同的测试,几天前,它运行得很好。
有趣的是,看起来好像是removed 2 years ago(2014年11月)并且最近可能会重新添加?
答案 3 :(得分:-2)
我发现了另一种可能导致这种情况发生的情况。我正在将PHP函数转换为JS函数,我有以下几行:
ticks += "," . Math.floor(yyy * intMax);
将其更改为
ticks += "," + Math.floor(yyy * intMax);
解决了问题