从我看到的使用调试器,调用:
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上。
答案 0 :(得分:1)
我们假设menu/main-menu.js
包含这个:
define(function () {
// Module factory function
return [... whatever you want to expose...];
});
您的应用程序执行此操作:
require(["menu/main-menu"], function (util) {
// Require callback.
});
会发生什么:
require
来电加载menu/main-menu.js
。
执行define
中的menu/main-menu.js
。
执行模块工厂功能(传递给define
的功能)。
执行require回调时,符号util
设置为
menu/main-menu.js
中的工厂功能返回了什么。
至于模拟命名空间,有多种方法可以实现。对于 例如,你可以这样做:
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,因为我没有 用它。