2

我有一个具有以下结构的脚本:

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 等处于同一级别的函数并尝试init()在 Test.FUNCTIONS 中调用它仍然不起作用。

编辑:

如果console.log(all_constants)我得到完整的对象(使用 .chunk_of_markup),但如果我console.log(tester)得到undefined. 如果我包装测试仪,我会得到[]

我还应该注意,另一个命名空间从单独的文件中获取标记。

任何想法为什么?

4

2 回答 2

1

准备好两个文件在这里并没有什么不同。您可以拥有一个 document.ready 和/或直接调用 Test.FUNCTIONS.init 并且所有这些都应该工作,并且它们位于不同名称空间中的事实也无关紧要。

至于你为什么没有定义,我认为这可能是因为你的chunk_of_markup变量实际上是未定义的。我的猜测是您通过 AJAX 获取它的值,因此调用是异步完成的,这意味着 DOM 将在它实际返回值之前准备好。当您使用调试器时,该值会在您运行命令的时间点进行评估,因此到那时,异步调用已经成功返回(这是一个竞争条件,如果您足够快并且您的 AJAX 很慢,那么您可以仍然未定义,这也是为什么 2 个准备好的函数恰好使它足够慢以使 AJAX 调用返回但它仍然不可靠)。

在所有情况下,如果我的理论是正确的,那么您需要挂钩 AJAX 请求的回调而不是 DOM 就绪事件,这是您可以保证定义变量的唯一地方。

于 2012-11-03T20:04:36.460 回答
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();
});
于 2012-11-03T19:43:49.777 回答