我有一个java脚本文件(.js),其中包含一些函数:
function func1(arg)
{
}
function func2(arg)
{
}
...
我想枚举js文件中定义的所有函数。 在javascript中是否有一个根对象来枚举所有子对象? (通过this post中定义的方法)
难看的解决方案:
一种方法是定义一个数组,如: var functions = [func1,func2,...];
另一种方法是字符串处理(例如正则表达式):
/功能。+(。+)/
我有更好的解决方案吗? 感谢。
答案 0 :(得分:4)
您可以尝试以下内容:
var Stub = new Object();
Stub.func1 = function(args) {/*Your code*/};
Stub.func2 = function(args) {/*Your code*/};
Stub.func3 = function(args) {/*Your code*/};
// enumerate through functions
for(f in Stub)
{
if (Stub.hasOwnProperty(f) && typeof Stub[f] === "function")
console.log(f);
}
我在这里将对象'Stub
'视为命名空间/类。
编辑:如果您无法控制JS文件(第三方),您仍然可以使用上述技术来确定文件中的函数列表。我假设js文件是在全局命名空间(窗口)上定义新函数。这是你做的:
步骤1:运行上面的脚本并将所有功能存储在窗口中(用窗口替换Stub)。
步骤2:动态加载新的JS文件(by adding a script tag linking to the external js file into the HEAD via JavaScript)并在加载JS文件后(即处于就绪状态),再次运行上述脚本。
步骤3:步骤2中报告的步骤1中尚未访问的任何功能是JS文件引入的新子集。
答案 1 :(得分:1)
您可以使用window
迭代所有全局函数。但它包含许多其他属性。
for(var fun in window){
// your code
}
答案 2 :(得分:1)
这是一种非常糟糕的方法;它枚举window
全局对象并筛选出列为[native code]
的对象。
for (var i in window) {
if (window.hasOwnProperty(i) &&
'function' === typeof window[i] &&
!Function.toString.call(window[i]).match('\[native code\]')) {
console.log(i)
}
}
可能不是非常跨浏览器,但它适用于Chrome。如果您可以将所有函数放在命名空间中,那会更好。
答案 3 :(得分:1)
JavaScript有一个根对象,只需打开控制台并输入this
或window
即可。如果要列出全局对象中的所有函数,只需像处理任何对象一样处理全局对象:
for (var property in this)
{
if (this.hasOwnProperty(property) && typeof this[property] === 'function')
{
console.log(property + ' is a function');
}
}
你可以省略.hasOwnProperty
检查,但请记住,所有对象(包括window
)都可以追溯到Object.prototype
,所以你可能会结束也列举了原型方法。更重要的是,全局对象也有自己的原型:Window.prototype
。一句警告:当谈到X浏览器问题时,全局对象是最糟糕的对象之一。 IE,Mozilla,Chrome,Opera 和 Safari之间都存在差异,有些甚至更多。