да............. забавно....
я сделаю несколько предположений,
не судите меня строго.
во прервых, мы оба с тобой правы
это для начала,
второе предположение,
как работаю функции которые вызываются друг из друга,
они не имеюют доступ к локальным переменным друг друга,
они сначала создают локальные переменны копируя их из списка локальных переменных функции caller;
то есть (возьму твой пример)

Код:
o["Nox"] = "Nox is right !";
o["john"] = "john is right !";
function external(param) {
var p = param;
var internal = function (msg) {
/*
заводятся переменные которые описаны списке аргументов
var msg = arguments[0];
если arguments.caller не null (функция вызвана функцией)
короче Call Stack
обратится к списку локальных переменных фунции и скопировать
их значения
var p = param;
var internal = arguments.callee;
*/
var test = o[p];
trace(msg+" :: "+test);
};
return internal;
/*
в момент сериализации временной функции,
создании ее внешней ссылки,
тот участок памяти который создавал копии внешний переменных
уже становится постоянным
*/
}
getInternal_1 = external("Nox");
getInternal_2 = external("john");
getInternal_1("What's up ?!");
getInternal_2("What's up ?!");
то есть присуствуют два процесса ......
вот такое предположение,
в любом случае, лед слишком тонкий чтобы использовать это,
я предпочту сдублировать передачу параметров, кто знает баг ли это или фича
