将参数移动到RequireJS的函数

时间:2014-05-31 15:23:20

标签: requirejs dependencies user-defined-functions amd

我不仅是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文档和一些视频时,我不能说我明白了...

感谢您的帮助。

1 个答案:

答案 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();
});