Also erst mal, Profitipp ist gut gesagt. Werde ich dann gleich mal ausprobieren müssen. Habe ehrlich gesagt von "debugger;" noch nichts gehört oder gelesen.
Das mit "function" und "undefined" spielt hier keine Rolle, denn der Bereich soll ja ausgeführt werden, wenn es NICHT da ist. Wenn es "undefined" wäre, dann wäre es ja keine "function" und somit auch erfüllt.
Console.log machte ich öfter, brachte aber nicht wirklich viel. Die Meldung, die kam, war ja unter anderem daraus. In dem Fall mit dem Log von Dir oben kommt nur "Object.values is not a function". Genau. Und darauf prüfe ich ja 
Das Ganze ist nun aber gelöst bzw. ich weiß nun auch was der von mir wollte. War wohl auch mein Denkfehler.
Ich wollte im Grunde nur: "wenn Du A nicht kannst, dann nimm B" oder eben in dem Fall oben andersherum. Also als Entscheidung, nimm native Funktionen oder eben eigene. In PHP geht das ja problemlos, solange kein Syntaxfehler da ist. Hier war mein Denkfehler!
Der JS-Compiler führt immer alles aus, egal ob er es kann oder nicht. Erst in der eigentlichen Anwendung wird entschieden, was ausgeführt wird und was nicht.
Wie gesagt, dieses "Object.values" kennt der IE11 nicht. Der kennt nur "Object.keys". Ebenso kennt er das "for ... of" nicht. Daher die beiden if/else, die im Inneren im Grunde das gleiche tun. Und eben genau dieses "for ... of" im Else wirft dann den Fehler, weil er es als Syntaxfehler ansieht.
Und mit gelöschtem Else wurde dann auch klar. Weiter unten im Code steht "lazyImages.forEach(img => lazyObserver.observe(img));". Die Schreibweise kennt der IE11 auch nicht und dadurch wurde dann viel weiter hinten im Script der Fehler "')' erwartet" ausgelöst.
Lösung war dann letztendlich, das "lazyImages.forEach(img => lazyObserver.observe(img));" umzuschreiben, damit der IE11 es auch kapiert und dann eben im Else das "for ... of" durch eine normale Schleife zu ersetzen.
Dann akzeptierte der IE11 die Syntax und es lief. Und ja, der IE11 führt das IF aus, alle anderen modernen Browser das ELSE.