Rolf B: Javascript: Warum hat Safari Probleme mit const?

Beitrag lesen

Hallo j.j.,

nochmal von vorn.

Du bindest das Script mit defer ein - okay. Damit gibt's keine Probleme mit einer Race Condition.

Dein gesamter Code hat diesen Grundaufbau:

try
{
   const xy;

   function trans() 
   {
      // use xy -> Reference Error
   }

   (onresize=function() {
      ...
      trans()
   })();
}
catch (e) {
}

Dieser Code enthält einige Gemeinheiten, und bei Gunnar gab's ja auch schon im Desktop-Safari einen Error.

Die Zuweisung an onresize registriert einen Eventhandler für das Resize-Event auf dem window-Objekt. Im gleichen Zuge rufst Du ihn auch gleich das erste Mal auf. Danach wird er bei jedem Resize des Fensters erneut aufgerufen.

Der große Unterschied zwischen const und var ist hier: var wird im globalen Scope definiert (weil var keine Blockscopes beachtet). const wird hingegegen im Blockscope des try/catch definiert. Sobald der try-Block durch ist, endet der Scope, in dem xy definiert wird und xy ist ein Kandidat für den Garbage Collector.

Der es aber leben lassen sollte, denn:

  • function trans referenziert xy. Solange es trans gibt, gibt es xy (trans bildet eine Closure und sollte den try-Scope einschließen)
  • Der resize-Handler referenziert trans. Solange es den resize-Handler gibt, gibt es trans (der resize-Handler bildet eine closure, die trans und auch xy einschließt)
  • der resize-Handler wurde an window.onresize zugewiesen. Damit sollte er bis zu einer anderen Zuweisung oder bis zum Reload der Seite existieren.

Es ist MÖGLICH, dass diese Referenzbeziehungen, die xy (also dein BL) am Leben erhalten sollten, von Safari nicht korrekt beachtet werden. Ich habe das gerade in Chrome/Android betrachtet, da wird es korrekt erhalten. Safari kann ich nicht testen. Kann es sein, dass die JavaScript-Engine von Safari Closures nur auf Funktionsscope-Ebene bildet?

Zum Error-Handling: Wenn der Browser (Safari oder sonst einer) den resize-Handler aufruft, dann ist der globale try/catch-Block nicht mehr gültig. Die Handler-Funktion wurde zwar darin definiert, aber der Exception-Kontext gilt nur beim ersten Script-Durchlauf. Nicht mehr, wenn später das resize-Event behandelt wird. Um Fehler im Resize-Handler mit try/catch zu behandeln, musst Du in dieser Funktion einen eigenen try/catch aufbauen.

Rolf

--
sumpsi - posui - obstruxi