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命名空间 - 如何根据命名导出函数范围内定义的函数和变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从命名空间导出,访问默认值? [复制]

如何从 Meteor 包导出到我的应用程序的命名空间?

如何导入***元素是非导出命名空间的 Typescript 类型定义文件?

如何避免javascript命名空间冲突?

如何声明对现有命名空间的引用,该命名空间可在运行时从 JavaScript 包中获得

在导出函数的命名空间中使用自定义类型