获取给定 JavaScript 范围内的已解析函数
Get parsed functions in a given JavaScript scope
我不确定这是否可行,但我在这里放了一个我想要实现的示例:
(function() {
function A() {}
function B() {}
var funcs = /* how do I get both A and B programatically? */;
})();
无法通过访问自调用函数内部的 window
和 this
来访问 A
和 B
。
我知道我可以在自调用函数中向 this
添加属性 A
和 B
,这解决了问题,但我想知道是否有办法检索它们具有命名函数。
更新
我相信问题很清楚:我想知道是否可以在不显式使用模块模式的情况下获得作用域命名函数。
归根结底,我希望验证我没有遗漏任何东西,并且无法以编程方式获取语法范围内的命名函数。
如果您正在寻找 php 中的 get_defined_vars
或 python 中的 locals
之类的东西,即 returns 中定义的所有名称的函数局部作用域,javascript 中没有这样的东西,也不可能以任何方式实现它(除了将函数源代码作为字符串获取并解析它)。
只是为了告诉你它会变得多么丑陋:
function get_funcs(fn) {
return fn.toString().match(/function\s+\w+/g).map(function(x) {
return x.split(" ").pop();
});
}
(function() {
function A() { document.write('I am A<br>'); }
function B() { document.write('I am B<br>'); }
get_funcs(arguments.callee).map(function(f) {
eval(f).call();
});
})();
你不能。参见 here。
Every execution context has associated with it a variable object. Variables and functions declared in the source text are added as properties of the variable object.
您无法访问变量对象。
此时,JavaScript 没有提供执行此操作的标准方法。可能可以利用各种 JavaScript 引擎的调试功能来实现类似的效果,但我不知道如何在任何特定引擎上执行此操作(或者他们是否允许您从 "inside"),并且为一个引擎找到的任何解决方案可能无法移植到任何其他引擎。
您可以做的是将这些函数收集到一个对象中,然后作为函数集合对其进行迭代。您的示例代码可能会翻译成这样:
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 相对)。无论哪种方式,因为此实现 returns 是一个普通对象,所以您可以像迭代任何其他对象一样迭代它。
您还应该调查 CommonJS 和 AMD 模块系统。如果其中任何一个适合您想要做的事情,它们都可以为您节省很多时间。
我不确定这是否可行,但我在这里放了一个我想要实现的示例:
(function() {
function A() {}
function B() {}
var funcs = /* how do I get both A and B programatically? */;
})();
无法通过访问自调用函数内部的 window
和 this
来访问 A
和 B
。
我知道我可以在自调用函数中向 this
添加属性 A
和 B
,这解决了问题,但我想知道是否有办法检索它们具有命名函数。
更新
我相信问题很清楚:我想知道是否可以在不显式使用模块模式的情况下获得作用域命名函数。
归根结底,我希望验证我没有遗漏任何东西,并且无法以编程方式获取语法范围内的命名函数。
如果您正在寻找 php 中的 get_defined_vars
或 python 中的 locals
之类的东西,即 returns 中定义的所有名称的函数局部作用域,javascript 中没有这样的东西,也不可能以任何方式实现它(除了将函数源代码作为字符串获取并解析它)。
只是为了告诉你它会变得多么丑陋:
function get_funcs(fn) {
return fn.toString().match(/function\s+\w+/g).map(function(x) {
return x.split(" ").pop();
});
}
(function() {
function A() { document.write('I am A<br>'); }
function B() { document.write('I am B<br>'); }
get_funcs(arguments.callee).map(function(f) {
eval(f).call();
});
})();
你不能。参见 here。
Every execution context has associated with it a variable object. Variables and functions declared in the source text are added as properties of the variable object.
您无法访问变量对象。
此时,JavaScript 没有提供执行此操作的标准方法。可能可以利用各种 JavaScript 引擎的调试功能来实现类似的效果,但我不知道如何在任何特定引擎上执行此操作(或者他们是否允许您从 "inside"),并且为一个引擎找到的任何解决方案可能无法移植到任何其他引擎。
您可以做的是将这些函数收集到一个对象中,然后作为函数集合对其进行迭代。您的示例代码可能会翻译成这样:
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 相对)。无论哪种方式,因为此实现 returns 是一个普通对象,所以您可以像迭代任何其他对象一样迭代它。
您还应该调查 CommonJS 和 AMD 模块系统。如果其中任何一个适合您想要做的事情,它们都可以为您节省很多时间。