我不仅是JavaScript的新手,也是RequireJS的新手(来自字符串C#背景)。目前在我的网页上我有许多JavaScript功能。每一个都有两个参数。想象一下,他们看起来像这样:
functionA(x1, y1) { ... }
functionB(x2, y2) { ... }
functionC(x3, y3) { ... }
目前,这些功能存在于我的HTML页面上的标签中,我只需根据需要调用它们。
我的函数依赖于KnockoutJS,jQuery和其他一些JS库。我目前有脚本标签,可以同步加载那些外部.js依赖项。但我想使用RequireJS,以便根据需要异步加载它们。为此,我计划将上面的所有三个函数移动到一个名为MyFunctions.js的外部.js文件(一种AMD“模块”)中。该文件将有一个define()调用(对于RequireJS的定义函数),它看起来像这样:
define(["knockout", "jquery", ...], function("ko","jquery", ...) {???} );
我的问题是如何“包装”我的functionA,functionB和functionC函数所在的位置???在上面,以便我可以根据需要在我的页面上使用这些功能。例如,在我的HTML页面上的按钮的onclick事件处理程序中,我想调用functionA并传递两个参数;对于functionB和functionC也是如此。
我不完全理解当这些函数包含在一个本身位于外部.js文件中的定义时,如何公开这些函数。我知道定义确保我的列出的库在调用回调函数之前异步加载,但在完成之后我不明白网页的脚本标记将如何使用我的函数。我是否需要使用require来确保它们可用,例如:
require(["myfunctions"],function({not sure what to put here})]
我想我理解RequireJS的基础知识,但我不明白如何包装我的函数,以便它们在外部.js文件中,不污染全局命名空间,但仍然可以从主要调用页面,以便可以将参数传递给它们。我想他们有很多方法可以做到这一点,但在审查那里的RequireJS文档和一些视频时,我不能说我明白了...
感谢您的帮助。
答案 0 :(得分:0)
让你的MyFunctions.js文件返回一个你想要公开的方法的对象,如下所示:
define([], function(){
function myPrivateFunction(){
console.log('in private function');
}
function myPublicFunction(){
console.log('in public function');
}
function myOtherPublicFunction(){
console.log('in the other public function');
}
return {
functionA: myPublicFunction,
functionB: myOtherPublicFunction
};
});
您为函数提供的参数名称需要MyFunctions
并不重要。依赖项数组中的名称字符串和字符串的顺序很重要,函数的参数顺序也很重要,但参数的名称却不重要。 E.g。
require('myFunctions', 'knockout', 'jquery', function(myFunctions, ko, $){
//here we can use the myFunctions, ko and $ variables.
//To call the public function, use the name which the function was
//exposed as; functionA
myFunctions.functionA();
});
上面的示例代码与以下内容完全相同:
require('myFunctions', 'knockout', 'jquery', function(my, k, j){
//In this example, your functions will be on the value of the 'my' variable,
//knockout will be the value of the 'k' variable and jQuery will be the
//value of the 'j' variable.
//To call the public function, use the name which the function was
//exposed as; functionA
my.functionA();
});