0

根据我使用调试器看到的情况,调用:

require(["menu/main-menu"], function(util) {

会加载 main-menu.js 文件,但是在执行所需的 .js 文件中的全局代码之前调用该函数?它是否正确?

如果是这样,在调用我的函数之前执行所有代码的最佳方法是什么?

我要解决的问题是我希望 mani-menu.js 中的代码都在一个模块中。但是在执行创建模块的全局代码之前,我不能调用该模块中的任何方法。

我可以在那里调用一个全局方法,然后创建所有内容,但这需要每个 .js 文件中的全局 init() 方法(每个文件都有一个唯一的名称)。

处理这一切的最佳方法是什么?

更新:这里有一个更基本的问题(也许)。在编写 javascript(我使用 Sencha Ext JS 和 TypeScript)时,我需要创建我的对象。因此,当我创建主菜单时,我想在 main-menu.js 文件中调用一个方法来获取我创建的 Ext JS 派生菜单对象。

我认为 main-menu.js 中的所有代码都应该在一个命名空间中,包括我为获取菜单对象而调用的方法。那是对的吗?此外,大多数 Ext JS 代码的设置方式是你有几个 Ext.define() 调用以及其他变量实例化,然后是一个函数,它接受所有这些,构建完整的菜单,并返回它。但这需要在我调用之前在 main-menu.js 中执行所有代码。

我正确地接近这个吗?迄今为止,我的经验是 Java 和 C#,我可能正试图将该模型错误地拟合到 javascript。

4

1 回答 1

1

让我们假设menu/main-menu.js包含这个:

define(function () {
    // Module factory function
    return [... whatever you want to expose...];
});

您的应用程序会这样做:

require(["menu/main-menu"], function (util) {
    // Require callback.
});

会发生什么:

  1. 调用require加载。menu/main-menu.js

  2. definein被menu/main-menu.js执行。

  3. 模块工厂函数(传递给 的函数define)被执行。

  4. util使用设置为工厂函数menu/main-menu.js返回的符号的符号执行 require 回调。

至于模拟命名空间,有多种方法可以做到。例如,您可以这样做:

define(function () {
    return {
        foo: function () {},
        bar: function () {},
        [...]
    };
});

这将导出一个包含两个函数的对象。然后你可以像这样使用它:

require(["menu/main-menu"], function (util) {
    util.foo();
    util.bar();
});

RequireJS 还支持 CommonJS 风格的定义模块:

define(function (require, exports, module) {
    exports.foo = function () {};
    exports.bar = function () {};
    [...]
});

这在功能上等同于我之前定义模块的第一种方式:您获得了相同的两个函数,并以与我在上面显示的相同的方式使用它们。

不幸的是,我不能专门谈论 Ext JS,因为我不使用它。

于 2013-11-09T00:29:28.513 回答