如何引用调用Javascript模块?

时间:2018-03-14 16:30:51

标签: javascript

我使用的是我理解的Javascript模块模式和jQuery。

我有一个有公共和管理员方面的应用。每个都有自己的JS文件,虽然一些功能是共享的,所以我把它解压缩到一个公共文件。 Gulp将公共+公共文件合并到一个文件中,以便在公共端使用,将公共+管理文件合并到一个文件中,以便在管理端使用。

公共JS文件包括:

var PublicFoo = (function () {

    var bar = function() {
        // ..
    };

    var init = function() {
        $button.on('click', Common.someCommonThing);
    };

    return {
        init: init
    };
})();

需要此代码的HTML页面会像这样触发它:

<script>
PublicFoo.init();
</script>

admin JS文件包含非常相似的内容,也定义了bar()函数,并调用相同的Common模块函数。

var AdminFoo = (function () {

    var bar = function() {
        // ..
    };

    var init = function() {
        $button.on('click', Common.someCommonThing);
    };

    return {
        init: init
    };
})();

常见的JS文件(与public和admin JS共享并结合使用)包括:

var Common = (function () {

    var someCommonThing = function() {
        // Do stuff.
        // When done, I want to call bar() in the calling module.
        // This does not work, throws 'Uncaught ReferenceError: bar is not defined'
        bar();
    };

    return {
        someCommonThing: someCommonThing,
        // ...
    };
})();

Common模块,我如何引用调用模块中的函数?

我知道.caller,但显然是that is non-standard and should not be used

我可以以某种方式将调用模块的名称作为参数传递给Common,并引用它,但这看起来很难看:

// In PublicFoo
var init = function() {
    $button.on('click', function() {
        Common.someCommonThing(PublicFoo)
    });
};

// In Common
var someCommonThing = function(callingModule) {
    // ...
    callingModule.bar();

我当然也可以提取bar()调出并在调用模块中执行,但这看起来并不那么整洁:

// In PublicFoo
var init = function() {
    $button.on('click', function() {
        Common.someCommonThing();
        bar();
    });
};

// ... and the same thing in AdminFoo

我觉得这必须是JS模块101,这是一个基本要求,但我似乎无法找到任何关于它的东西,尽管我可能正在使用错误的术语进行搜索。或者是我无法找到如何做到这一点的原因,因为它不应该这样做?

如何从bar()模块引用相应的Common

2 个答案:

答案 0 :(得分:1)

将函数传递给其他函数是非常常见且非常惯用的JavaScript,所以你可以这样做:

// In PublicFoo
var bar = function() {
    // ..
};

var init = function() {
    $button.on('click', function() {
        Common.someCommonThing(bar)
    });
};

// In Common
var someCommonThing = function(bar) {
    // ...
    bar();
};

答案 1 :(得分:1)

  

我知道.caller,但显然这是非标准的,不应该使用。

此外,它不适用于您的情况,因为调用者是事件处理程序,PublicFooAdminFoo都没有。

  

我可以以某种方式将调用模块的名称作为参数传递给Common,并引用它

是的,如果您希望someCommonThing在完成后执行不同的操作,则将引用传递给您想要调用的内容。请注意,当事物是异步时,你真的应该只使用这样的回调,否则只需返回并在之后调用bar(就像在你的上一个片段中一样)就容易多了。

  

如何从bar()模块引用相应的Common

如果同时将两个bar加载到页面中,则无法引用引用回调的参数。

但是,在您的示例中似乎并非如此 - 在一个页面上,AdminFoo扮演Foo角色,而另一个页面PublicFoo扮演Foo角色Foo.bar的作用。

因此,只需引用Common中的var Foo = AdminFoo !让相应的页面用适当的值填充它,即

var Foo = PublicFoo
管理页面上的

=Choose(1,LookupSet(Fields!Knight.Value,Fields!Knight.Value,Fields!Princess.Value,"InputData"))
=Choose(2,LookupSet(Fields!Knight.Value,Fields!Knight.Value,Fields!Princess.Value,"InputData"))
=Choose(3,LookupSet(Fields!Knight.Value,Fields!Knight.Value,Fields!Princess.Value,"InputData"))

在公共页面上。