我创建了一个新的全局对象,然后将所有的东西放入到这个新对象中,这样它就不会干扰其他任何人所做的任何事情。调用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>
最后我得到了两个“bf”,一个是原始的全局对象,另一个是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()的屏幕截图:

好些了吗?
发布于 2015-09-29 15:30:10
在脚本标记的顶层范围内,所有变量都隐式地附加到window中。
好消息是,您实际上没有两个bf对象,只有一个有两种方法来访问它。
var bf = {};
bf.foo = "bar";
document.getElementById('output').innerHTML = JSON.stringify(window.bf, undefined, 4);<div id="output"></div>
发布于 2015-09-29 15:31:13
在函数作用域外声明的变量绑定到全局作用域。因为您在脚本标记中声明var bf = {},所以它的父对象是window对象。
这个MDN文档是JavaScript中关于变量的一个很好的读物。
发布于 2015-09-29 16:26:55
Rossipedia有两个很好的答案,同时也让我找到了这个问题。看看他的职位。
由于未知的原因,jQuery版本1.11.1 (我使用的是v1.11.3,因此在我的文章中使用1.11.1\3)有某种错误,这在jQuery版本2.1.3中是固定的。
但我还发现,我用来为我们的站点生成菜单的程序之一是生成一个旧的函数名(showIt而不是show_menu),这也造成了问题。通过修复生成的函数名,问题已经解决了。
这并不意味着jQuery的人可以“是的!我们不需要修复任何东西!”因为这是一个有效的错误,我发布的简单代码显示了如何破坏jQuery,这可能意味着有一些方法可以导致jQuery的实际问题。因此,基本上,这应该由更符合jQuery的人来研究,以找出为什么我发布的代码会做它所做的事情。然后他们可以回来说:“你这个白痴!你干了蠢事!你不该这么做!”或者“感谢你找出了这个世界上没有人遇到或关心的真正晦涩的问题。”无论如何,这是一个已知的问题。:-)
https://stackoverflow.com/questions/32847945
复制相似问题