我使用的是我理解的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
?
答案 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,但显然这是非标准的,不应该使用。
此外,它不适用于您的情况,因为调用者是事件处理程序,PublicFoo
和AdminFoo
都没有。
我可以以某种方式将调用模块的名称作为参数传递给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"))
在公共页面上。