我创建了一个新的全局对象,然后将所有内容放入该新对象中,这样它就不会干扰其他任何人做的事情。在调用document.ready()函数之后,由于未知原因,这会被移动到window.bf。我把它简化为一个简单的例子。任何人都对正在发生的事情有任何想法?
<html>
<head>
<title>Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
debugger;
var bf = {}; // Namespace
bf.vars = [];
bf.vars['onclick'] = "";
$(document).ready(function() {
bf.noop = function() {}
bf.noop();
window.bf.noop();
});
</script>
</head>
<body>Test</body>
</html>
所以我结束了两个“男朋友”。一个是原始全局对象,第二个是window.bf对象。我的问题是:最初,全局对象中包含所有函数和变量。现在全局变量除了bf.vars(一个数组)之外什么都没有。其他所有内容现在都在window.bf对象中(包括应该进入全局bf.vars数组的所有内容,但我从未要求这样做。
截至上周五(2015年9月25日),这种情况并未发生。现在确实如此。
更新:我刚尝试删除document.ready()函数。如果删除document.ready()部分 - 则全局bf对象将返回为全局变量。所以这似乎与jQuery本身有关。
在有人问之前:使用document.ready()的原因是因为我定义的一些函数引用了需要加载的位置,而jQuery说要使用document.ready()函数以便确保在执行开始之前已加载所有元素。 bf.noop()函数只是给出一个函数的例子,并显示该函数不再显示在全局bf对象中。
使用document.ready()进行屏幕截图:
没有document.ready()的屏幕截图:
更好?
答案 0 :(得分:5)
在脚本代码的顶级范围内,所有变量都隐式附加到window
。
好消息是,你实际上没有有两个bf
个对象,你只有一个有两种方法可以访问它。
var bf = {};
bf.foo = "bar";
document.getElementById('output').innerHTML = JSON.stringify(window.bf, undefined, 4);
<div id="output"></div>
答案 1 :(得分:4)
在函数范围之外声明的变量绑定到全局范围。由于您在脚本标记内声明var bf = {}
,因此其父级是window
对象。
This MDN document可以很好地读取JavaScript中的变量。
答案 2 :(得分:0)
由于未知原因,jQuery版本1.11.1(我使用v1.11.3,因此我的帖子中的1.11.1 | 3)存在某种错误,该错误已在jQuery 2.1.3版中修复。
但我也发现我用来为我们网站生成菜单的程序之一是生成一个旧的函数名称(showIt而不是show_menu),这也引起了问题。通过修复生成的函数名称,问题就消失了。
这并不意味着jQuery人可以去#34;是的!我们不必修理任何东西!&#34;因为这是一个有效的错误,我发布的简单代码显示了如何破解jQuery,这可能意味着有一些方法可以导致jQuery的实际问题。所以基本上,这应该由更多与jQuery协调的人来查看,以找出我发布的代码为什么会这样做。然后他们可以回来说'你是白痴!你做了BLAH!你不应该有!&#34;或许&#34;感谢您找到这个真正模糊不清的问题,这个问题是整个世界上没有其他人遇到或关心的问题。&#34;无论如何 - 这是一个已知的问题。 : - )