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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.11.2010, 20:00
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 11  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
А разве у анонимной функции вообще this буде определён? Что-то ту не так.

Добавлено через 8 минут
Код AS3:
package test{
	import flash.display.Sprite;
 
	public class abra extends Sprite{
		private var test1:testClass;
		private var test2:testClass;
 
		public function abra():void{
			test1 = new testClass();
			test2 = new testClass();
 
			var qqq:Function = test1.a1;
			var www:Function = test2.a1;
			var qwe:Function = test2.a2;
			var eee:Function = test1.a3;
 
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			qqq();
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			www();
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			qwe();
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			qqq.call(test2);
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			qqq.apply(test2);
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			eee();
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			eee.call(test2);
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
			eee.apply(test2);
			trace("test1.a = " + test1.a + "; test2.a = " + test2.a);
		}
	}
}
class testClass{
	public var a:uint = 0;
 
	public var a3:Function = function():void { a += 3; };
 
	public function testClass(){
	}
 
	public function a1():void	{
		a += 1;
	}
 
	public function a2():void	{
		a += 2;
	}
}
трейсы
Код:
test1.a = 0; test2.a = 0
test1.a = 1; test2.a = 0
test1.a = 1; test2.a = 1
test1.a = 1; test2.a = 3
test1.a = 2; test2.a = 3
test1.a = 3; test2.a = 3
test1.a = 3; test2.a = 3
test1.a = 3; test2.a = 6
test1.a = 3; test2.a = 9
Теперь мне вообще мозг рвёт, как эта анонимная функция получает доступ к this? Как это компилируется вообще? Для анонимной функции a вообще не определена, как это работает?

Старый 29.11.2010, 20:29
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 12  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Я не могу понять, что непонятно автору. Я сам лет пять назад на плюсах писал, потом вообще ничего не писал кроме макросов на ВБА, и сейчас вот ас3 занялся.

Собственно попробую своими словами объяснить:

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

теперь что получается.
мы взяли класс, объявили в нем функцию, создали на эту функцию ссылку. Ну и всё. Эта ссылка позволяет нам вместо class.funk() писать просто funkLink();
Но как бы эту ссылку не использовали - все-равно объект функции является дочерним для своего класса.

Для того чтобы это обойти - нужно оперировать наследованием классов и играться уже со всякими там this.* и super.* - но как-то быстро объяснить особенности не получится, это уже по конкретным примерам лучше.

Старый 29.11.2010, 21:06
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 13  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Aquahawk Посмотреть сообщение
А разве у анонимной функции вообще this буде определён? Что-то ту не так.
this в анонимах тестил BlooDHound. Гляньте в поиске.

От себя.
Если только в научных целях, то простительно. Очень уж не хотелось бы видеть function-mind код в реальных проектах. Больно тяжко читать и править их.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 29.11.2010, 21:21
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 14  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
как эта анонимная функция получает доступ к this
Где вы там аноним увидели???

Эта фугнкция принадлежит классу testClass

Код AS3:
public var a3:Function = function():void { a += 3; };
Это всё-равно что:
Код AS3:
public аunction a3 (): void{ 
     a += 3; 
};
Просто методы объявления разные.

Аноним это если вы делаете примерно так:
Код AS3:
addEventListener(Event.CLOSE, Function(){a++;})
/*могу ошибиться в синтаксисе, ибо таким методом никогда не пользуюсь, всегда объявляю нормальные функции*/
Разница в том что первый пример является таким же методом/свойством класса, а второй вариант - это временная функция, которую объявили в коде внутри и забыли.

Добавлено через 5 минут
Аноним потому что имени нету, как бы банально не звучало)))

Ссылки нету ВООБЩЕ.

В первом же варианте вы ее обозвали паблик переменной с именем а3.


Последний раз редактировалось Dukobpa3; 29.11.2010 в 21:24.
Старый 29.11.2010, 22:09
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 15  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Dukobpa3 вы не правы в том что
Код AS3:
public var a3:Function = function():void { a += 3; };
Код AS3:
public аunction a3 (): void{ 
     a += 3; 
};
Одно и тоже, внимательнее прочитайте мои тесты и результаты трейса. Функция объявленная как анонимная и присвоенная переменной класса будучи вызвана отдельно от объекта не модифицирует ничего, будучи вызвана через объект модифицирует его, будучи вызвана посредством call() с объектом-параметром отличным от того объекта от которого она была взята, модифицирует новый объект. Тогда как настоящий метод игнорирует параметр call() и apply()

Добавлено через 9 минут
dimarik я категорически не собираюсь писать подобный код, но понимание абсолютное того как это работает мне необходимо.

Старый 29.11.2010, 23:01
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 16  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
dimarik я категорически не собираюсь писать подобный код, но понимание абсолютное того как это работает мне необходимо.
Аха, постарайтесь, пожалуйста. =)
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 29.11.2010, 23:10
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 17  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от Aquahawk Посмотреть сообщение
Dukobpa3 вы не правы в том что
хм... внатуре...
*пошел учить мат-часть*

Был свято уверен в том что это идентичные примеры. Простите за дезинформацию.

В таком случае присоединюсь к вопросу: в чем разница между .call() и .apply().

Старый 29.11.2010, 23:32
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 18  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
В таком случае присоединюсь к вопросу: в чем разница между .call() и .apply().
Первая принимает параметры через запятую, вторая - массив.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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