Wenn man es gut versteht, kann man es einfach erklären. Und am einfachsten ist es, wenn man es aus dem Kontext herausnimmt. Code beiseite, sogar Programmierung beiseite. Ein metaphorisches Beispiel wird es besser machen.
Stellen wir uns vor, dass eine Funktion ein Raum ist, dessen Wände aus Glas bestehen, aber es ist ein spezielles Glas, wie in einem Verhörraum. Von außen sind sie undurchsichtig, von innen sind sie durchsichtig. Es können Räume in anderen Räumen sein, und die einzige Kontaktmöglichkeit ist ein Telefon.
Wenn man von außen anruft, weiß man nicht, was drin ist, aber man weiß, dass die Leute drinnen eine Aufgabe erledigen werden, wenn man ihnen bestimmte Informationen gibt. Sie können nach draußen sehen, also können sie dich nach Dingen fragen, die draußen sind, und Änderungen an diesen Dingen vornehmen, aber du kannst von außen nicht ändern, was drinnen ist, du siehst (weißt) nicht einmal, was drinnen ist. Die Menschen in dem Raum, den du anrufst, sehen, was draußen ist, aber nicht, was in den Räumen in diesem Raum ist, also interagieren sie mit ihnen so, wie du es von außen tust. Die Menschen im Inneren der innersten Räume können viele Dinge sehen, aber die Menschen im äußersten Raum wissen nicht einmal von der Existenz der innersten Räume.
Für jeden Anruf in einem inneren Raum halten die Mitarbeiter dieses Raums die Informationen über diesen speziellen Anruf fest, und sie sind so gut darin, dass sie niemals einen Anruf mit einem anderen Anruf verwechseln.
Räume sind Funktionen, Sichtbarkeit ist der Bereich, Personen, die eine Aufgabe erledigen, sind Anweisungen, Dinge sind Objekte, Telefonanrufe sind Funktionsaufrufe, Telefonanrufinformationen sind Argumente, Anrufaufzeichnungen sind Bereichsinstanzen, der äußerste Raum ist das globale Objekt.