1

重複の可能性:
JavaScript のグローバル ユーザー定義関数のリスト?

いくつかの関数を含む Java スクリプト ファイル (.js) があります。

function func1(arg)
{
}

function func2(arg)
{
}

...

js ファイルで定義されているすべての関数を列挙したい。それによってすべてのサブオブジェクトを列挙するためのjavascriptのルートオブジェクトはありますか? (この投稿で定義されているメソッドによる)

醜い解決策:

1 つの方法は、次のように配列を定義することです。 var functions = [func1, func2, ...];

もう 1 つのアプローチは、文字列処理 (正規表現など) です。

/関数.+(.+)/

私はそれに対するより良い解決策がありますか?ありがとう。

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 に置き換えます) を配列に格納します。

ステップ 2: 新しい JS ファイルを動的にロードし (外部 js ファイルにリンクする script タグを JavaScript 経由で HEAD に追加することにより)、JS ファイルがロードされた後 (つまり、準備完了状態)、上記のスクリプトを再度実行します。

ステップ 3: ステップ 2 で報告され、ステップ 1 でまだアクセスされていない関数は、JS ファイルによって導入された新しいサブセットです。

  • それで、あなたはそれを持っています。
于 2012-10-04T07:50:12.553 に答える
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

を使用してすべてのグローバル関数を反復できますwindow。しかし、他の多くのプロパティが含まれています。

for(var fun in window){

   // your code
}
于 2012-10-04T07:50:15.517 に答える
1

JavaScript にはルート オブジェクトがあり、コンソールを開いて と入力するだけthisですwindow。グローバル オブジェクト内のすべての関数を一覧表示する場合は、グローバル オブジェクトを他のオブジェクトと同様に扱います。

for (var property in this)
{
    if (this.hasOwnProperty(property) && typeof this[property] === 'function')
    {
        console.log(property + ' is a function');
    }
}

チェックを省略できますが、 を含むすべてのオブジェクトはまでさかのぼることができるため、プロトタイプメソッドも列挙することになる可能性があることに注意してください。さらに、グローバル オブジェクトには独自のプロトタイプもあります。警告の言葉: X ブラウザーの問題に関して言えば、グローバル オブジェクトは対処するのに最悪のオブジェクトの 1 つです。IE、Mozilla、Chrome、Opera 、およびSafari にはすべて違いがあります。.hasOwnPropertywindowObject.prototypeWindow.prototype

于 2012-10-04T08:02:44.553 に答える