Javascript命名空间 - 如何根据命名导出函数范围内定义的函数和变量?
Posted
技术标签:
【中文标题】Javascript命名空间 - 如何根据命名导出函数范围内定义的函数和变量?【英文标题】:Javascript namespacing - how to export functions and variables defined within a function scope based on their naming? 【发布时间】:2013-01-02 16:49:36 【问题描述】:使用下面的代码,除了手动指定之外,有没有办法只导出名称不以下划线开头的函数和变量?
var myapp = myapp || ;
myapp.utils = (function()
var
CONSTANT_A = "FOO",
CONSTANT_B = "BAR";
function func()
function _privateFunc()
return //return all variables and functions whose name does not have the "_" prefix.
());
【问题讨论】:
我认为除了arguments
之外,您无法访问当前堆栈帧。如果您按照惯例执行此操作,则可以翻转它,使用名为 _
的“导出”对象,并通过执行 _.func = function() ...
导出函数
您是否考虑过为您希望导出的所有函数和属性设置一个单独的对象?
@millimoose - 这是我一直在考虑的另一种方法。这种方法的唯一缺陷是,在访问函数中的变量时,我必须包含命名空间名称(在这种情况下为_
)。前任。在func()
中,我必须调用_.CONSTANT_A
而不仅仅是CONSTANT_A
。不过,这只是一个小麻烦。
@kinsho - 你的建议基本上类似于millimoose的。看起来没有办法实现我正在寻找的东西,所以我可能需要接受你/millimoose 的建议。谢谢。
为什么不把要导出的函数定义为返回的对象字面量的成员方法??
【参考方案1】:
您的想法需要能够列出本地范围内的所有变量。不幸的是,javascript 无法做到这一点。见this related question。
我见过有两种方法可以做到这一点:
1) 将每个变量定义为要导出的对象时附加:
var myapp = myapp || ;
myapp.utils = (function ()
var exports = ;
exports.CONSTANT_A = "FOO",
exports.CONSTANT_B = "BAR";
exports.func = function func()
function _privateFunc()
return exports;
());
2) 或者在对象字面量的末尾列出所有导出:
var myapp = myapp || ;
myapp.utils = (function ()
var
CONSTANT_A = "FOO",
CONSTANT_B = "BAR";
function func()
function _privateFunc()
return
CONSTANT_A: CONSTANT_A,
CONSTANT_B: CONSTANT_B,
func: func
;
());
我已经在实践中看到了两者(甚至两者的混合)。第二个可能看起来更迂腐,但也允许读者查看单个代码段并查看该函数返回的整个接口。
【讨论】:
正确,但如果将它们声明为形式参数,则可以使用 arguments 对象访问它们:function(foo, bar) for (var p in arguments)...
。
感谢您的参考和建议。以上是关于Javascript命名空间 - 如何根据命名导出函数范围内定义的函数和变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何导入***元素是非导出命名空间的 Typescript 类型定义文件?