Hallo,
Ich habe, um den Namespace sauber zu halten, das Script in eine anonyme Funktion gebettet. Werden von hier aus jetzt weitere Scripte nachgeladen, liegen diese leider wieder im globalen Namespace.
Das ist nicht zu vermeiden, ohne sich auf den Kopf zu stellen. Sinnvoller wäre es, mit einer richtigen Modularisierung zu arbeiten. Das kann vom einfachen Revealing Module Pattern bis zu Lösungen wie RequireJS reichen. Scripte sollten sich in bestehende Module einklinken oder eigene erzeugen – andernfalls kann man nicht sinnvoll Code nachladen, ohne dass das globale Objekt verschont wird.
Als Lösung fällt mir z.Zt. nur AJAX und eval ein, gibt es da besseres?
Damit kannst du wahrscheinlich nicht erreichen, was du vorhast. Beispiel:
(function () {
// Hier kannst du direkt eval aufrufen und 'var' (sowie Function Declarations) in dem Code erzeugen lokale Variable in diesem Function-Scope. Aber der Code kann auch globale Variablen erzeugen:
eval('var foo = 123; bar = 456;');
alert(typeof foo); // Number
alert(typeof window.foo); // undefined
alert(typeof bar); // Number, wegen Scope Chain
alert(typeof window.bar); // Number
// Bei weiterer Verschachtelung wird es schwieriger:
function loadScript () {
var xhr = ...;
// Hier kannst Code laden und du eval nutzen, aber mit var deklarierte Variablen werden im loadScript-Scope angelegt
eval(xhr.responseText);
// Angenommen xhr.responseText == 'var quux = 789;'
alert(typeof quux); // Number
alert(typeof window.quux); // undefined
}
loadScript();
// Hier kannst du schon nicht mehr darauf zugreifen
alert(typeof quux); // undefined
alert(typeof window.quux); // undefined
})();
Du könntest natürlich das eval irgendwie in der obersten IIFE unterbringen, damit es in allen darin verschachtelten Funktionen verfügbar ist. Dann müsstest du mit synchronem Ajax arbeiten und die Scripte beim ersten Ausführen der IIFE laden – das ist wahrscheinlich nicht Sinn der Sache, oder?
Zum Thema ist http://perfectionkills.com/global-eval-what-are-the-options/ ganz interessant, auch wenn es dort eigentlich um das Gegenteil von dem geht, was du vorhast.
Mathias