|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
А разве у анонимной функции вообще this буде определён? Что-то ту не так.
Добавлено через 8 минут 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; } } Теперь мне вообще мозг рвёт, как эта анонимная функция получает доступ к this? Как это компилируется вообще? Для анонимной функции a вообще не определена, как это работает? |
|
|||||
Я не могу понять, что непонятно автору. Я сам лет пять назад на плюсах писал, потом вообще ничего не писал кроме макросов на ВБА, и сейчас вот ас3 занялся.
Собственно попробую своими словами объяснить: - есть класс. - в нем есть функция (функция как мы уже выяснили является объектом) - все имена классов и функций являются просто ссылками (вот этого я сам долго не мог понять после работы с плюсами), а объекты болтаются где-то в вакууме. - если функция объявлена в классе, то она принадлежит классу, это просто дочерний элемент класса, какими бы танцами с бубном не пытались ее вызвать. -- Потому неудивительно что она изменяет переменную принадлежащую своему классу, ведь в теле функции прописано что она изменяет переменную своего класса, а не полученную извне. Если бы функция принимала какие-то значения извне, то может и был бы какой-то эффект иной. теперь что получается. мы взяли класс, объявили в нем функцию, создали на эту функцию ссылку. Ну и всё. Эта ссылка позволяет нам вместо class.funk() писать просто funkLink(); Но как бы эту ссылку не использовали - все-равно объект функции является дочерним для своего класса. Для того чтобы это обойти - нужно оперировать наследованием классов и играться уже со всякими там this.* и super.* - но как-то быстро объяснить особенности не получится, это уже по конкретным примерам лучше. |
|
|||||
.
|
Цитата:
От себя. Если только в научных целях, то простительно. Очень уж не хотелось бы видеть function-mind код в реальных проектах. Больно тяжко читать и править их. |
|
|||||
Цитата:
Эта фугнкция принадлежит классу testClass Это всё-равно что: Просто методы объявления разные. Аноним это если вы делаете примерно так: addEventListener(Event.CLOSE, Function(){a++;}) /*могу ошибиться в синтаксисе, ибо таким методом никогда не пользуюсь, всегда объявляю нормальные функции*/ Добавлено через 5 минут Аноним потому что имени нету, как бы банально не звучало))) Ссылки нету ВООБЩЕ. В первом же варианте вы ее обозвали паблик переменной с именем а3. Последний раз редактировалось Dukobpa3; 29.11.2010 в 21:24. |
|
|||||
Dukobpa3 вы не правы в том что
Одно и тоже, внимательнее прочитайте мои тесты и результаты трейса. Функция объявленная как анонимная и присвоенная переменной класса будучи вызвана отдельно от объекта не модифицирует ничего, будучи вызвана через объект модифицирует его, будучи вызвана посредством call() с объектом-параметром отличным от того объекта от которого она была взята, модифицирует новый объект. Тогда как настоящий метод игнорирует параметр call() и apply() Добавлено через 9 минут dimarik я категорически не собираюсь писать подобный код, но понимание абсолютное того как это работает мне необходимо. |
|
|||||
.
|
Цитата:
|
|
|||||
хм... внатуре...
*пошел учить мат-часть* Был свято уверен в том что это идентичные примеры. Простите за дезинформацию. В таком случае присоединюсь к вопросу: в чем разница между .call() и .apply(). |
|
|||||
.
|
Первая принимает параметры через запятую, вторая - массив.
|
Часовой пояс GMT +4, время: 15:53. |
|
« Предыдущая тема | Следующая тема » |
|
|