Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取给定JavaScript范围内的已解析函数_Javascript_Function_Scope - Fatal编程技术网

获取给定JavaScript范围内的已解析函数

获取给定JavaScript范围内的已解析函数,javascript,function,scope,Javascript,Function,Scope,我不确定这是否可行,但我在这里提供了一个我想要实现的示例: (function() { function A() {} function B() {} var funcs = /* how do I get both A and B programatically? */; })(); 通过访问自调用函数内部的窗口和此无法访问A和B 我知道我可以将属性A和B添加到自调用函数中的this,这就解决了这个问题,但我想知道是否有办法使用命名函数检索它们 更新 我认为问题非常清楚:

我不确定这是否可行,但我在这里提供了一个我想要实现的示例:

(function() {
   function A() {}
   function B() {}

   var funcs = /* how do I get both A and B programatically? */;
})();
通过访问自调用函数内部的
窗口
无法访问
A
B

我知道我可以将属性
A
B
添加到自调用函数中的
this
,这就解决了这个问题,但我想知道是否有办法使用命名函数检索它们

更新 我认为问题非常清楚:我想知道我是否可以在不明确使用模块模式的情况下获得作用域命名函数


最后,我希望验证我没有遗漏任何东西,也没有办法通过编程获得语法范围的命名函数。

如果您正在寻找php中的
get\u defined\u vars
或python中的
locals
之类的东西,即返回本地范围中定义的所有名称的函数,javascript中没有这样的东西,也不可能以任何方式实现它(除非将函数源代码获取为字符串并对其进行解析)

只是想让你看看它有多丑陋:

函数get_funcs(fn){ 返回fn.toString().match(/function\s+\w+/g).map(function(x){ 返回x.split(“”.pop(); }); } (功能(){ 函数A(){document.write('I am A
');} 函数B(){document.write('I am B
');} get_funcs(arguments.callee).map(函数(f){ eval(f.call(); }); })();您不能。看

每个执行上下文都与一个变量对象关联。源文本中声明的变量和函数作为变量对象的属性添加


您无法访问变量对象。

此时,JavaScript没有提供标准方法来执行此操作。也许可以利用各种JavaScript引擎的调试功能来实现类似的效果,但我不知道如何在任何特定的引擎上实现这一点(或者如果它们甚至允许您从“内部”完成),并且为一个引擎找到的任何解决方案都可能无法移植到任何其他引擎

您可以将这些函数收集到一个对象中,然后将其作为函数集合进行迭代。您的示例代码可能会转换为以下内容:

var myModule = (function () {
    var exports = {};

    // Define your functions
    function A() {};
    function B() {};

    // Collect the functions you want to be part of the collection
    exports.A = A;
    exports.B = B;
    return exports;
}());
您可以做得更简洁一些,如下所示:

var myModule = (function () {
    var exports = {};

    exports.A = function () {};
    exports.B = function () {};

    return exports;
}());
这在JavaScript世界中称为模块模式。这个术语在更一般的计算机科学中有更广泛的含义,但在JavaScript社区中,它通常意味着实现更一般模式的这种特定方式(与CommonJS或AMD相反)。无论哪种方式,由于此实现返回一个普通对象,因此可以像迭代任何其他对象一样对其进行迭代


您还应该调查CommonJS和AMD模块系统。如果其中任何一个都符合您要做的,那么它们可以为您节省大量时间。

您要做什么?将
A
B
分配给
funcs
?@thefourtheye我想像一个functions@FSou1如果我不知道名称,并且希望在整个范围内迭代所有函数,该怎么办注:我将在5小时内检查答案/评论!!提前感谢;)在我看来,这是一个好消息。你为什么要这么做?谢谢你,但正如我在问题中所说的,我知道我可以走模块模式的路。像“没有办法”这样的回答就足够了!!你在问题中提到的东西似乎更像是将函数注册为全局函数(或者更确切地说,使它们成为全局对象的属性),这就是我感到困惑的原因。是的,我们也可以使用Esprima解析器,但是,我想验证是否有其他方法可以在不进行解析的情况下执行此操作。谢谢你的努力。顺便说一句,我不是PHP/Python开发人员,所以我忽略了这些语言实现类似的东西…@MatíasFidemraizer:so被数以百万计的人使用,对你没有立即有用的信息可能对其他人有价值。当然,我知道这是我问题的正确答案。这就是为什么我不能理解接近票和反对票以及XY问题的原因。。。我每天都使用模块模式,我希望验证JS是否仍然不支持获取解析函数(而不是匿名函数),因为我通常利用业余时间进行我自己的研发,研究如何改进当前框架实现某些功能的方式。非常感谢。