2012-03-09 10 views
2

私は、ベンダーが私たちのウェブサイトに入ることを期待している(時にはひどい)JavaScriptをたくさん扱わなければなりません。それらのうちのいくつかは、名前空間を持たない任意の名前をグローバルスコープに追加します。私はこれらのプログラムをサンドボックス化するという考え方を変えていますので、グローバルスコープに直接アクセスすることはできませんが、実際にはうまくいくものは考えられませんでした。 (私はフェッチされたコードを思いついたと思ったが、それは悪い考えだと確信している)グローバル名前空間を保護するサードパーティJavaScriptをサンドボックスできますか?

サードパーティ製の任意のJavaScriptを使用している間にグローバルスコープをきれいに保つための解決策はありますか?

編集:@ kirilloidのコメントは、このコードがどのように配信されたかについてはっきりしていないことを伝えています。私は通常コードを私たちのウェブサイトに入れることはありません。ほとんどの場合、私はただURLを与えられ、それを指すscriptタグを作成するように頼んでいます。

+0

コードを挿入すると、関数呼び出しにドロップされ、必要な機能のみが表示されます。 http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth – kirilloid

+0

@kirilloid混乱して申し訳ありません。モジュールパターンを使用するコードがあればモジュールパターンを使用できます。上記の私の* eval *のアイデアでこれをやっていましたが、たいていの場合、他の場所でホストされているサードパーティのスクリプトを指し示すURLが与えられています。私はこれを反映するために私の質問を更新しました。 – kojiro

答えて

4

オプションはかなり制限されています。コードが<script>タグの形で提示されている場合、修正することはできません。

スクリプトを変更できる場合は、クロージャでコードをラップすることができます。 varがグローバルスコープで公開されていると宣言した変数はすべて停止します(ただし、暗黙的なグローバルでは問題は発生します)。

(function() { 

    var aGlobalVariableThatUsedToCauseACollision = 4; // no longer collides! 

    anotherGlobalVariableThatUsedToCauseACollision = 4; // Mmmmm. 

}()); 

おそらく実行不可能なオプションです。あなたは暗黙のグローバルを使用することを防ぐ "厳密な使用"を使用することができますが、コードがひどいので、これはあなたを助けません。あなたが閉鎖であなた自身コードをラップし、そこに重要なウィンドウのプロパティのローカルコピー(undefined)などを維持することができ作ることができる

追加の変更(およびprehaps最高)。こうすることで、他のスクリプトがあなたのものに影響するのを防ぐことができます(これはjQueryのようなライブラリです)。

(function (jQuery, $, undefined) { 
    alert(undefined == 4); // false! 
}(jQuery, $)); 

undefined = 4; 
+1

彼らのコードがひどい場合、おそらくグローバルな名前空間オブジェクトへの参照に依存しており、これをサンドボックス化するか、名前空間を変更すると破壊される可能性があります。最良の選択肢は、自分を悪から守ることです。 – jjNford

関連する問題