![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
Не всетаки вернемся к функциям,
важный вопрос, поэтому нужно дообсудить, function foo()
{
var param = "Nox";
var any = function (o)
{
param = arguments.callee.param;
o["Nox"] = "NoxNoctis прав!";
o["john"] = "john прав!";
var m = o[param];
// по твоей логики это должно выглядеть при создании функции как
// var m = o["Nox"]; но это ж не так! :)
trace(m);
};
any.param = "john";
any({});
}
foo();
![]() |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
мдя... че-то я запарился к вечеру... в голове какой-то void(null) :D :D :D
попробуй такой трейсик: function foo() {
var a_foo = function () {
var test = [root_trace(1)];
trace("a_foo");
return test;
};
return a_foo;
}
function root_trace(msg) {
trace(msg+" :: root_trace");
return "str";
}
trace(foo()());
значит он вызывается в момент инициализации ! за регистеркласс спасибо, сейчас не разберусь, но завтра сутра посмотрим :))) Последний раз редактировалось Nox Noctis; 25.04.2002 в 22:43. |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
function foo() {
var param = "Nox";
var any = function (o) {
// а вот следующую строчку мы нафиг убьем :D
// param = arguments.callee.param;
// ...я ведь об этом и говорю !!
o["Nox"] = "NoxNoctis прав!";
o["john"] = "john прав!";
var m = o[param];
// var m = o["Nox"]; и это так!
trace(m);
};
any.param = "john";
any({});
}
foo();
Последний раз редактировалось Nox Noctis; 25.04.2002 в 22:54. |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
function foo() {
var a_foo = function () {
var test = [root_trace(1)];
trace("a_foo");
return test;
};
return a_foo;
}
function root_trace(msg) {
trace(msg+" :: root_trace");
return "str";
}
trace(foo()());
root_trace трейсится первым ! причем тресится _единожды_ непонимаю почему бы и нет? var test = [root_trace(1)]; trace("a_foo"); естественно первая строчка потом вторая, а вот если бы ты был прав, то было бы как раз наоборот. |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
нет, этот код лишь показывает что внутренняя рутовая функция и инициализированная фунция находятся в одном пространстве имен, и рутовая функция не удалила свои переменные,
|
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
мм... "встретимся завтра, я что-то скажу..." ©сплин :)))
извини, завтра продолжим :)) ...меня ждут в оффлайне :)) |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
![]() ок, да и мне пора в офлайн ![]() |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
до завтра я не дотерпел :))
знчт так, по порядку... (а то мало ли кто-то еще кроме нас это читает :D ) о чем спор: – одна функция создает другую – функция, которая создается зависит от параметра функции создающей я утверждаю: во внутренней функции происходят подстановки значений на место параметра в момент создания ты утверждаешь: эти подстановки происходят в момент выполнения отуда я взял свое: o["Nox"] = "Nox is right !";
o["john"] = "john is right !";
function external(param) {
var p = param;
var internal = function (msg) {
var test = o[p];
trace(msg+" :: "+test);
};
return internal;
}
getInternal = external("Nox");
getInternal("What's up ?!");
– создаем функцию и возвращаем на нее ссылку. – вызываем ее: поскольку внешняя функция закончила работу, то параметр param больше не существует => по твоей логике мы должны во время выполнения функции getInternal получить var test = o[undefined]; , потому как переменную 'p' взять уже неоткуда, так ведь ? ....но вместо undefined мы получаем то, что нужно ! и все было бы замечательно, если бы не другой тест: o["Nox"] = "Nox is right !";
o["john"] = "john is right !";
function external(param) {
var p = param;
var internal = function (msg) {
var test = o[p];
trace(msg+" :: "+test);
};
var p = "john";
return internal;
}
getInternal = external("Nox");
getInternal("What's up ?!");
мы меняем переменную уже _после_ объявления функции, а получаем.... ну, хорошо... есть ведь замычательная функция delete: напишем delete p; перед ретурном во внешней функции... результат тот же, что и в первом варианте ! ладно, отвлечемся от главной темы - а работает ли делет, если его так использовать ? function deleteTest(param) {
var testVar = param;
var backUp = param;
trace("thing to kill :: "+testVar);
delete testVar;
trace("is it deleted ?! :: "+((testVar != backUp) ? "YEAH" : "NO"));
}
deleteTest("delete me !");
что-то я перестаю что-либо понимать... скажи мне в чем сила, брат ? :)))) |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
да............. забавно....
я сделаю несколько предположений, не судите меня строго. во прервых, мы оба с тобой правы это для начала, второе предположение, как работаю функции которые вызываются друг из друга, они не имеюют доступ к локальным переменным друг друга, они сначала создают локальные переменны копируя их из списка локальных переменных функции 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 ?!");
вот такое предположение, в любом случае, лед слишком тонкий чтобы использовать это, я предпочту сдублировать передачу параметров, кто знает баг ли это или фича ![]() Последний раз редактировалось john; 26.04.2002 в 02:43. |
|
|||||
|
don't panic!
Регистрация: Aug 2001
Сообщений: 4,121
|
каждый баг - потенциальная фича
(обратное тоже верно ! )а вообще - немного похоже на правду... только тогда получается, то во внутреннюю, создаваемую функцию попадает что-то типа обращения по указателю на параметр ? и если меняем значения того, что по тому адресу лежит, то... так что ли ? мягко скажем это несколько странно... Последний раз редактировалось Nox Noctis; 26.04.2002 в 03:21. |
![]() |
Часовой пояс GMT +4, время: 11:16. |
|
|
« Предыдущая тема | Следующая тема » |
|
|