2012-01-10 4 views
1

私は、いくつかのJavascriptファイルを1つに統合し、それらを条件付きで適用しようとしている状況があります。私は実際のファイルを変更したくありません。これらのファイルをラップしてオンデマンドで呼び出す方法はありますか?入れ子関数をJavascriptのグローバルスコープに配置できますか?

これらのファイルの中には、関数xyz(){}が含まれているものがあります。だから、if(false){function xyz(){}}でそれらをラップすると、悪いことが起こります。例えば

、これは私のコードであれば...

if (includeFile) { 
    /* The file */ 
    function foo() {} 
    /* The file */ 
} 

問題はクロームがfoo()を参照してくださいとグローバルスコープeven if includeFile is falseに配置されることになります。

簡単な解決策はvar foo = function(){}に変更することですが、これらのファイルを変更することはできません。

私はまた、これらの関数がかなり大きいので、eval()を実行することについて一般的に懸念しています。 (関数内にjQueryが入っていると思っていますが、問題がなければevalは答えでしょうか?)

関数をネストしてスコープとしてウィンドウを渡すことができましたが、tried it on jsFiddle and it didn't seem to workです。

(function() { 
    function foo() { 
     alert('it works'); 
    } 
}).apply(window, []); 

foo(); 

questionssimilarいくつかあります。しかし、誰も私が持っているのと同じ状況に対処していません。ありがとう。

+0

したがって、問題は、複数のファイル間で名前の衝突があることです - 複数の関数xyz?それらを本当に悪いものに変更していますか?エラーを導入すること、または上流に適合することを心配していますか?あなたは機械的に名前を変更できますか?どういうわけかsedまたは細分化ツールで? – Rup

+0

私は、縮小ツールやマクロプリプロセッサのラインに沿って考えています。あなたは何人の 'xyz'を扱わなければなりませんか?そして、その一部だけが特定のページ上で実行される場合、すべてのものを1つのファイルに入れるのは実際には最良のアイデアですか? –

+0

まあ、考え方は、ページやコンテキストによっては、あまりにも多くのファイルが読み込まれているということです。どこかに約100のさまざまなリソース(CSSや画像を含む)。したがって、この数字を減らすために、私たちは頻繁に使用されるいくつかのファイルを結合しようとしています。この場合、いくつかはライブラリであり、いくつかは社内コードです。 これまでは、関数xyz(){}をグローバルスコープに配置することについて心配していませんでした。新しい結合ファイルで、if(false){function xyz(){}}がグローバルスコープで終わるので、それをvar foo = function(){function xyz(){}}にラップしているとわかりました。 if(false){foo(); } –

答えて

2

require.jsのようなライブラリを使用したことはありますか?よりエレガントな方法であなたのためにこれを行うことができるいくつかのライブラリがあります。

jQueryなどのライブラリを使用している場合は、AJAXリクエストを使用して条件付きでスクリプトをロードできます(jQueryの場合はscriptデータ型を使用します)。これは単純なeval()よりはるかに優れていますが、一連の依存関係を管理しようとすると堅牢性が低下します。あなたは、単にすべてを連結する場合

ここでもう一つのオプションは、グローバルスコープに置く、無名関数内の各ファイルをラップして、windowオブジェクトに必要な要素を割り当てることです:

(function(window) { 

    /* file 1 here */ 
    function xyz() { 
     // etc ... 
    } 
    /* end file 1 */ 

    // now selectively choose what you want to be 
    // in the global scope 
    window.xyz = xyz; 

}(window)); 

xyz(); 

しかし、これは世界中で利用できるものを特定するために、より多くの作業を必要とします。匿名関数の引数としてwindowを渡す必要があることに注意してください。ただし、複数回参照する場合は悪い考えではありません(これにより、参照のスピードアップとコード中の変数名の変更が可能になります)。圧縮)。

+0

これは最初からすべてのコードを記述していればよい解決策ですが、問題の主な焦点は、グローバルスコープにネストされた関数を明示的に配置できる場合です。 –

+0

ああ、そうです。私の編集を参照してください - 私はあなたが何をしようとしていると思います。 – nrabinowitz

+0

ありがとうございます。 [それは動作するようです](http://jsfiddle.net/y9D7E/)。私が知ることから、これは私たちが得る最高のものだと思う。私はこれで生きることができますが、私は何らかの巧妙なラップを本当に望んでいました。どのようにして(function(){function xyz(){}})のようにすることができますかを見ることができます。apply(window、[]);卑劣な解決策として。 –

関連する問題