1

可能重复:
JavaScript 中的全局用户定义函数列表?

我有一个包含一些功能的 java 脚本文件 (.js):

function func1(arg)
{
}

function func2(arg)
{
}

...

我想枚举 js 文件中定义的所有函数。javascript中是否有一个根对象来枚举所有子对象?(通过这篇文章中定义的方法)

丑陋的解决方案:

一种方法是定义一个数组,如: var functions = [func1, func2, ...];

另一种方法是字符串处理(如正则表达式):

/函数.+(.+)/

我有更好的解决方案吗?谢谢。

4

4 回答 4

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 步:运行上述脚本并将 window 上的所有函数(将 Stub 替换为 window)存储在一个数组中。

第二步:动态加载新的JS文件(通过JavaScript将链接到外部js文件的脚本标签添加到HEAD中),JS文件加载完成后(即处于就绪状态),再次运行上述脚本。

步骤3:步骤2中报告的任何在步骤1中尚未访问的函数都是JS文件引入的新子集。

  • 所以你有它。
于 2012-10-04T07:50:12.553 回答
1

您可以使用 迭代所有全局函数window。但它包含许多其他属性。

for(var fun in window){

   // your code
}
于 2012-10-04T07:50:15.517 回答
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。如果您可以将所有函数放在命名空间中,那就更好了。

于 2012-10-04T07:57:35.733 回答
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、OperaSafari 之间都存在差异,其中一些差异更大。

于 2012-10-04T08:02:44.553 回答