PDA

Просмотр полной версии : Занимательный ActionScript (ч.III)


Suhoff
18.07.2002, 01:37
В FrameActions пишем такой скрипт:

0[0]=0(0);

Хотя смысла в этом скрипте нет никакого, но такие выражения допускаются в AS (!!!!). Запускаем на выполнение... получаем swf... декомпилируем flasm'ом- получаем:

frame 0
push 0.0, 0.0, 0.0, 1
callFunction
setMember
end // of frame 0

ОПА!!! Откуда взялась единица????!!!! В выражении её нет и в помине!!! :confused:
Вот если бы мы записали выражение в виде:

0[0]=1(0);

тогда всё было бы точно, а так получается, что в AS 0==1 (!!!) Забавно...
Более того.... можно записать это выражение в виде

0[0]=N(0)

где N- числовой литерал (любое целое число) и при этом результат всё равно будет один и тот же:

frame 0
push 0.0, 0.0, 0.0, 1
callFunction
setMember
end // of frame 0

те в AS любое целое число равно единице!!!! :D
.......
Как говорила Алиса "... чем дальше - тем чудесатее и чудесатее..." :)

PS. Кстати... Сравнение - 0[0]==0(0) даёт true!! Те одна полная фигня равна другой полной фигне... Отсюда вывод - программе по-фигу какую фигню Вы в неё напишите..... :):):):):):):):)

CyberMax
18.07.2002, 04:00
сабж (только без обид).

Единица это количество параметров передаваемых функции с именем "0".
PS. Кстати... Сравнение - 0[0]==0(0) даёт true!! Те одна полная фигня равна другой полной фигне...
И тут тоже все правильно. И 0[0] и 0(0) равны одному и тому же. А именно == undefined. Так что все правильно.

PS Кстати ничего абсурдного в записях типа 0[0] и 0(0) нет. Функции и переменные с такими именами существовать могут.


this['0'] = function(n) {
trace("\tФигню говорите, адназначно ! Аргумент равен "+n);
}

0(1812);


PPS :D :D :D

DeliMIter
18.07.2002, 21:08
Да ладно вам, пацаны, я недавно [i] написал (с пустотой перед скобками), чтобы опустить мешающий this - снямало... правда, эээ, не сработало...

Suhoff
19.07.2002, 01:27
Звиняте, господа...Звиняйте.... Обшибочка-с вышла-с.....
Действительно, "1" - это количество параметров функции....
Всё правильно... да.... Всё правильно.......
.....Только постойте!!!!! Количество параметров ЧЕГО????? Где, скажите пожалуйста, ИМЯ вызываемой функции?? А??
Если мы запишем

0[0]=foo(0)

то получим при декомпиляции flasm'ом -

frame 0
push 0.0, 0.0, 0.0, 1 , 'foo'
callFunction
setMember
end // of frame 0

Это понятно......
А в нашем случае - где имя функции???? Нету!!!!!!
Поэтому AS по-фигу, чему равно N в выражении

0[0]=N(0)

N может равнятся любому числу (кстати, не только целому), результат от N не зависит!!!!
Это и ввело меня в заблуждение...Так что мой глюк я могу смело разделить с господами из Micromedia..:)

2CyberMax
... То что такие операции (записи) в AS допустимы - я знаю. Об этом я сказал в начале предыдущего сообщения...
Вообще в AS много "интересных" допустимых грамматикой операций.... Ну, например, навскидку....

~void null;

flasm даёт -
frame 0
push NULL
pop
push UNDEF, 4294967295.0
bitwiseXor
pop
end // of frame 0

что в переводе означает, что производится операция -

undefined^0xffffffff

Ну ничего не боится AS!!!! Ему по-фигу....:)

Ещё..... Когда пишешь this['0'] не обязательно заключать ноль в кавычки (те считать ноль строкой). Можно написать и this[0] (те считать ноль числом) - это тоже самое...
Согласно ECMA-262 -
................
ObjectLiteral : See 11.1.5
{ }
{ PropertyNameAndValueList }

PropertyNameAndValueList : See 11.1.5
PropertyName : AssignmentExpression
PropertyNameAndValueList , PropertyName : AssignmentExpression

PropertyName : See 11.1.5
Identifier
StringLiteral
NumericLiteral
............................
Те именем свойства объекта может быть и численный литерал.....
И ещё .... О той функции, что ты привёл в качестве примера.... Согласно вышеизложенному эта функция работет только в том варианте, что у тебя записана ....
this[0]=function(){.......};
вызываем -> 0();(или что ТОЖЕ САМОЕ null(); )--> получаем результат...
Если мы запишем
this[1]=function(){.......};
и вызовем ТАКУЮ функцию -> 1(); то получим полный фиг-вам....!!!!
Функция то в наличии имеется, а вот вызвать её - не получится......
Насчёт моего PS. Это, конечно, была шутка... Хотя, как говорится. в кождой шутке есть только ДОЛЯ шутки... Просто в голове не укладывается что сравнивая две НЕОПРЕДЕЛЁННЫЕ величины мы получаем ИСТИНА... В голову приходит такая сценка.... :)
".....
Судья-
... господа присяжные заседатели... Неустановленное лицо в неустановленное время в неустановленном месте совершило , а может быть и не совершило, неустановленное деяние.... Вы должны вынести вердикт - виновно ли это лицо.....
Присяжные (хором)-
...ДА!! ДА!! Виновен!!!!....Виновен!!!!....
Судья-
...На основании вердикта присяжных суд выностит приговор!!! Неустановленное лицо приговаривается к неопределённому сроку в неопределённом месте с произвольным режимом... "
Ну не абсурд ли??? А??? :)
Мне кажется, что было бы более логичным, если бы в операциях сравнения (Х rel_op Y) при значении одного из операндов X или Y (или обоих вместе) 'undefined' результат тоже был бы 'undefined'. Те, если нет информации для принятия решения, то результат - неопределён.Конечно, этому препятствует то, что в булевой логике есть только два значения - true и false. Но в конце концов - почему бы не отойти от булевой логики и не ввести в логику третье значение - (true, false, UNDEFINED)!!! Инструкция IF, например, могла бы выглядеть тогда следующим образом -

IF (condition) E_TRUE Statement1 E_FALSE Statement2 E_UNDEF Statement3;

Statement1 выполняется когда значение condition==true
Statement2 выполняется когда значение condition==false
Statement3 выполняется когда значение condition==undefined

Why not???? как говорится....:) Есть же на белом свете "fuzzy" логика??? И, говорят, прекрасно работает....
....Ладно... Всё это уже мои фантазии на тему... Пойду-ка я, лучше, почитаю про "fuzzy" логику ... Может что интересное узнаю....

Всем - пока!

PS 2DeliMIter
Смотрим ECMA-262 -
......
ArrayLiteral : See 11.1.4
[ Elision_opt ]
[ ElementList ]
[ ElementList , Elision_opt ]

ElementList : See 11.1.4
Elision_opt AssignmentExpression
ElementList , Elision_opt AssignmentExpression

Elision : See 11.1.4
,
Elision ,
.......
так что ничего удивительного в том, что выражение -> [i] схавало - нету ... Это ArrayLiteral....... :)

DeliMIter
19.07.2002, 17:38
this[0] = function() {
. . .
}

. . .

this[0]();

Suhoff
20.07.2002, 01:30
2DeliMIter

Ты наверное имел в виду

this[1] = function() {.....}
.......
this[1]();

????
Да... я ошибся.... такую функцию можно вызвать вышеописанным способом.... Я это понял утром, когда проснулся... Но было уже поздно.. :)
Воистину говорят - "Утро вечера мудреннее".
С уважением. Suhoff.