In einer Web-App, die es Benutzern ermöglicht, mit Javascript zu spielen, benötige ich eine function main()
in ihrem "Programm". Es gibt eine Schaltfläche "Ausführen" und eine Schaltfläche "Bearbeiten". Wenn Sie "run" drücken, wird ein Text aus einem <textarea>
verwendet, um einen Skriptblock zu erstellen und in das DOM einzufügen. Dann wird main()
aufgerufen.Speichert der Browser kompilierte Versionen von Skriptelementen persistent?
Ich fange window.onerror
, um Fehler für den Benutzer anzuzeigen. Dies funktioniert in der Regel in Ordnung. Wenn main()
nicht vorhanden ist, wird eine entsprechende Fehlermeldung angezeigt.
Wenn Sie "Bearbeiten" drücken, wird der Skriptblock auf leer gesetzt (script.text = '';
) und aus dem DOM entfernt.
Testing, bemerkte ich, dass wenn ich „Programm“ hatte, bestehend aus nur:
function main() { printLn('main here'); }
es wie erwartet funktioniert, aber wenn ich das geändert zu:
function moon() { printLn('moon here'); }
anstatt eine Nachricht zu bekommen sagt main() not defined
, es funktionierte immer noch wie zuvor, trotz der Tatsache, dass der Skriptblock den "Mond" -Text hatte. Dies passierte weiterhin, wenn ich jedem erstellten Skriptblock eine unverwechselbare ID gab, und wenn ich den Skriptblocktyp vor dem Entfernen auf text/plain
änderte.
Das Problem tritt in aktuellen Firefox, Chrome und Opera auf. Sie können sehen, was passiert here
Das dynamische Definieren und Aufrufen einer Funktion zum Aufruf von main hilft nicht. Main ist eine Funktion in dem Code, den der Benutzer eingegeben hat. Die dynamisch erzeugte Funktion ruft sie auf, und danach gibt typeof main 'function' zurück. Ich frage mich, ob der beste Ansatz darin besteht, den Hauptfunktionsnamen durch Markieren einer inkrementierenden Ganzzahl zu individualisieren, dann die Seite neu zu laden, wenn sie 100 oder eine beliebige Zahl erreicht, um den Müll zu beseitigen. –
@SteveTeale Der Code in dieser Antwort erstellt einen Abschluss, der "main" definiert und aufgerufen wird. Er existiert nicht außerhalb des Abschlusses, sodass keine Eindeutigkeit sichergestellt oder erhöht werden muss. –
Der Benutzer hat einen Skriptblock erstellt, in dem die Funktion main() definiert wurde.Damit die Seite funktioniert, muss diese Funktion aufgerufen werden. –