Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 25.04.2002, 22:40
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 21  
john
МЕГАФЛЭШЕР

Регистрация: 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();
Твой ответ?

Старый 25.04.2002, 22:40
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 22  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: 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()());
root_trace трейсится первым ! причем тресится _единожды_
значит он вызывается в момент инициализации !


за регистеркласс спасибо, сейчас не разберусь, но завтра сутра посмотрим :)))


Последний раз редактировалось Nox Noctis; 25.04.2002 в 22:43.
Старый 25.04.2002, 22:47
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 23  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: 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.
Старый 25.04.2002, 22:50
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 24  
john
МЕГАФЛЭШЕР

Регистрация: 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");

естественно первая строчка потом вторая,
а вот если бы ты был прав,
то было бы как раз наоборот.

Старый 25.04.2002, 22:54
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 25  
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
нет, этот код лишь показывает что внутренняя рутовая функция и инициализированная фунция находятся в одном пространстве имен, и рутовая функция не удалила свои переменные,


Код:
function foo() {
	var param = "Nox";
	var any = function (o) {
		o["Nox"] = "NoxNoctis прав!";
		o["john"] = "john прав!";
		var m = o[param];
		trace(m);
	};
	var param = "john"; 
	any({});
}
foo();

Старый 25.04.2002, 22:57
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 26  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
мм... "встретимся завтра, я что-то скажу..." ©сплин :)))
извини, завтра продолжим :)) ...меня ждут в оффлайне :))

Старый 25.04.2002, 23:01
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 27  
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181

ок,
да и мне пора в офлайн

Старый 26.04.2002, 01:27
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 28  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: 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 !");
ммм... не работает...

что-то я перестаю что-либо понимать...

скажи мне в чем сила, брат ? :))))

Старый 26.04.2002, 02:41
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 29  
john
МЕГАФЛЭШЕР

Регистрация: 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.
Старый 26.04.2002, 03:13
Nox Noctis вне форума Посмотреть профиль Отправить личное сообщение для Nox Noctis Посетить домашнюю страницу Nox Noctis Найти все сообщения от Nox Noctis
  № 30  
Nox Noctis
don't panic!
 
Аватар для Nox Noctis

Регистрация: Aug 2001
Сообщений: 4,121
каждый баг - потенциальная фича
(обратное тоже верно ! )

а вообще - немного похоже на правду...

только тогда получается, то во внутреннюю, создаваемую функцию попадает что-то типа обращения по указателю на параметр ?
и если меняем значения того, что по тому адресу лежит, то... так что ли ?
мягко скажем это несколько странно...


Последний раз редактировалось Nox Noctis; 26.04.2002 в 03:21.
Создать новую тему   Часовой пояс GMT +4, время: 11:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 11:16.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.