Die dynamische, also falsche, Bindung wurde (aus Versehen und Bequemlichkeit) in den ersten LISP-Varianten benutzt (1960). Das Problem tritt wirklich erst auf, wenn man nicht nur mit Zahlen, sondern auch Funktionen rechnet (also nicht in FORTRAN), und insbesondere, wenn diese symbolisch (wie in LISP) repräsentiert werden.
In Sprachen wie C passiert nichts, weil es dort keine geschachtelten Funktionsdefinitionen gibt. In Algol68 schon. Spätestens da (1968) war aber die Lösung (statische Aufrufkette mitnehmen) wohlbekannt. (Die C-Erfinder wußten das natürlich (1970) auch, wollten aber tatsächlich die Sprache so einfach halten, daß man diese Methode gar nicht braucht.)
Nebenbemerkung zum Musik-Sequencer: Der rechnet in der jetztigen Version doch mit dynamischer Bindung. Warum? Dort steckt noch ein Trick drin. die Parameter werden nicht durch dranschreiben an den Funktionsnamen, sondern durch benannte Notation übergeben. Dann möchte man einige (die meisten) der Argumente weglassen, falls weiter draußen Defaults gesetzt wurden. Um diese Defaults zu finden, möchte ich entlang der dynamischen Kette suchen. Vielleicht ist das aber doch nicht so clever, sondern verwirrt den User. (Soviele gibts da aber noch nicht :-)
Let-Bindungen sind eine typische Form in Funktionalen Sprachen. Der Unterschied zwischen rekursiven und nicht rekursiven Bindungen ist oft explizit sichtbar (let und letrec in ML). Da Haskell wie gesagt lazy evaluation hat, kann man dort alles per Default mit letrec machen.