我有一个具有以下结构的脚本:
Test = {
CONSTANTS : {},
VARIABLES : {},
MARKUP : {},
FUNCTIONS : {
init : function () {
// Access variable from different namespace
var all_constants = DifferentNamespace.CONSTANTS; // WORKS
var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
}
},
init : function () {
// Call real init() function
$(document).ready(function () {
Test.FUNCTIONS.init();
});
}
};
$(document).ready(function () {
Test.init();
});
如果我删除$(document).ready(..)
函数调用中的任何一个,当我尝试从不同的命名空间访问常量时,它是未定义的;两者都运作良好。
正如您所看到的,我正在使用两个init()
函数,只是为了将对init的调用结束,因为我已将函数包装在另一个对象中。
如果我删除与CONSTANTS,VARIABLES等处于同一级别的函数并尝试在Test.FUNCTIONS中调用init()
,它仍然无效。
编辑:
如果我console.log(all_constants)
我获得了完整的对象(使用.chunk_of_markup),但是如果我console.log(tester)
获得undefined
。如果我包裹测试人员我得到[]
我还应该注意,另一个命名空间从单独的文件中获取标记。
任何想法为什么?
答案 0 :(得分:1)
准备两份文件并没有什么不同。你可以有一个document.ready和/或直接调用Test.FUNCTIONS.init,所有这些都应该有效,而且它们在不同的命名空间中的事实并不重要。
至于你未定义的原因,我认为这可能是因为你的 chunk_of_markup 变量实际上是 undefined 。我的猜测是你通过AJAX得到它的值,因此调用是异步完成的,这意味着DOM在它实际返回一个值之前就已经准备好了。当您使用调试器时,在运行命令的时间点评估该值,那么异步调用已经成功返回(这是一个竞争条件,如果你足够快并且你的AJAX很慢那么你可以仍然得到未定义,这也是为什么2个就绪函数恰好让它足够慢以便AJAX调用返回但它仍然不可靠的原因)。
在所有情况下,如果我的理论是正确的,那么你需要挂钩AJAX请求的回调而不是DOM就绪事件,这是你可以保证你的变量被定义的唯一地方。
答案 1 :(得分:0)
为什么不在文档处理程序本身中调用function init()
..我认为这不会导致同样的问题。您可以完全删除Test.init()
,因为它似乎没有这里有什么
Test = {
CONSTANTS : {},
VARIABLES : {},
MARKUP : {},
FUNCTIONS : {
init : function () {
// Access variable from different namespace
var all_constants = DifferentNamespace.CONSTANTS; // WORKS
var tester = DifferentNamespace.CONSTANTS.chunk_of_markup; // SAYS UNDEFINED
}
}
};
$(document).ready(function () {
Test.FUNCTIONS.init();
});