Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Function.apply vs. Function.call (http://www.flasher.ru/forum/showthread.php?t=98534)

this.create 15.07.2007 20:53

iNils: Тема образовалась из обсуждения темы Проблема с кодом

Kikasso
А вызов через apply не считается теперь нехорошей практикой? Как eval.

silin 15.07.2007 21:04

this.create, а че? давай новую новую тему замути.., про понятия в AS..,выступи с заявлением.., перетрем..
а здесь-то ты где apply /eval углядел, в недрах Tween (еще где?), так не к месту базар..

Kikasso 15.07.2007 21:16

Цитата:

Сообщение от this.create
Kikasso
А вызов через apply не считается теперь нехорошей практикой? Как eval.

Да-да, а ты в классы загляни. В тот же Delegate.
silin, я там применил. Кошмар.

iNils 15.07.2007 21:34

У eval и apply разная природа. Eval - директива компилятору и в конечный байткод не попадает.

silin 15.07.2007 21:35

:)
ни eval ни, тем более apply в числе deprecated не значатся..
другое дело, удобно/нужно ли ими пользоваться..
eval ни разу не понадобился, а вот без apply/call не знаю как..

надо съезжать во флейм или другую тему, а то чел спросил как ему с кнопками разобраться, а тут ..

iNils 15.07.2007 21:44

Без apply тяжело, а call я не знаю, где можно применить.

Kikasso 15.07.2007 21:57

Цитата:

Сообщение от iNils
У eval и apply разная природа. Eval - директива компилятору и в конечный байткод не попадает.

не попадает?
Код:


txt = createTextField('txt', 0, 210, 5, 200, 20);
txt.border = true;
txt.type = 'input';
mc = createRect('mc', 10);
mc1 = createRect('mc1', 110 );
mc.onPress = function(){
 txt.text = this;
}
mc1.onPress = function(){
 txt.text = eval(txt.text)._x;
}
function createRect(id, x){
 var mc = createEmptyMovieClip(id, getNextHighestDepth());
 with(mc){
  beginFill(0, 100);
  lineTo(90,0); lineTo(90,30); lineTo(0,30); lineTo(0,0);
  endFill();
  }
 mc._x = x;
 return mc;
}

Можно например ввести _level0.mc1 или _root.txt
Цитата:

Сообщение от iNils
Без apply тяжело, а call я не знаю, где можно применить.

Если значение вдруг вернуть понадобится..

iNils 15.07.2007 22:34

Цитата:

Сообщение от Kikasso
не попадает?
Можно например ввести _level0.mc1 или _root.txt

Я это знаю, но самого eval в байт коде нет, есть набор инструкций.
Цитата:

Сообщение от Kikasso
Если значение вдруг вернуть понадобится..

Значение можно вернуть и обычным способом, фишка в том, что можно метод одного объекта применить к другому объекту.
Код:

_global.func = function (a, b) {
        trace (this + " " + a + " " + b);
};
func (1, 2);
_root.func (3, 4);
func.call (_root, 5, 6);

Весь вопрос в аргументах. Используя call, мы не можем передать аргументов больше, чам было прописано при его вызове, а вот с apply такое возможно. То есть call урезан в эффективности по сравнению с apply, и поэтому мне просто не понятно, зачем он нужен.

silin 15.07.2007 22:43

а вот и не кому не нужная дискуссия:
apply предает аргументы массивом, а call списком (в смысле перечислением через запятую, не знаю как правильно это называется), что из них более подходит диктует задача..
но спорить я не стану: apply , так apply ..:)

iNils 15.07.2007 22:47

Цитата:

Сообщение от silin
что из них более подходит диктует задача..

Можешь привести пример, когда apply не подходит? Вот пример с call пожалуйста, в Delegate (не родной, а мой) или Proxy, для передачи произвольного числа параметров, call ни как не подходит, ну только если не описать там тупо call (obj, a, b, c, d, e, ...)

Kikasso 15.07.2007 22:52

Цитата:

Сообщение от iNils
Значение можно вернуть и обычным способом

Точно, возращает... Опять в хелпе косяк:
Цитата:

public apply(thisObject:Object, [argArray:Array]) : Void
Тогда только один смысл: если аргументов фиксированое значение, скобок меньше.
И работает втрое быстрее, как оказалось..
Код:

function test( a, b){ return a*b; }
var t = getTimer();
var i = 10000;
while( i--){
test.apply(null, [2,2]);
}
trace( getTimer() - t);//207
t = getTimer();
i = 10000;
while( i--){
test.call(null, 2,2);
}
trace( getTimer() - t);//89
trace('-------------');


etc 15.07.2007 23:00

call применяется в моем McFactory, apply там попросту не нужен.

iNils 15.07.2007 23:03

Цитата:

Сообщение от __etc
call применяется в моем McFactory, apply там попросту не нужен.

Отличие в коде, только в наличии [], это так страшно? :)
Я же говорю о том, что apply может ПОЛНОСТЬЮ заменить собой call, а наоборот нет.

silin 15.07.2007 23:08

ok, согласен : скрипач не нужен..
но видимо он нужен был на ранних стадиях разработки , а потом жалко было выбросить..
офТоп: опять лирика: есть люди, которые особо не задумываясь пользуются шикарными/мощными (не побоюсь этого слов) возможностями языка, которые нам MM (теперь как бы Adobe) дают, и счастливы..
но есть которым ( их список невелик), этого мало: им дай дай именно совершенный инструмент, из-за этого они будут (нет не искать изъяны, но искать возможности) совершенствовать то, то что казалось бы и так работает..

что из этого выйдет?
а то, что они будут знать (досконально) уже данный им инструмент..
их подходы однозначно будут работать (они уже на все грабли понаступали..
дальше сами додумаете ..
iNils, я не провокатор, но тебе надо формулировать/публиковать список этих наблюдений/рецептов..

iNils 15.07.2007 23:14

Это не на столько актуальная тема, чтобы ее в FAQ помещать. Новичкам она не нужна, а тем кому интересно, через поиск найдут.

etc 15.07.2007 23:20

Я не вижу никакого смысла в данном топике.

Kikasso 15.07.2007 23:21

Я думаю, apply() через call() реализован. Опять же, лишний массив, хоть и временный. Вот и проигрыш по времени.
Если надо много чего-то быстро изменить.. Например, пикселы..

etc 15.07.2007 23:25

Я по привычке использую call, мне его название понятнее, чем apply… :D
На вкус и цвет все фломастеры разные :)

iNils 15.07.2007 23:32

Цитата:

Сообщение от __etc
Я не вижу никакого смысла в данном топике.

Ну как нет, вот выяснили, что в хелпе написано, что apply ничего не возращает, а это не так :D

etc 16.07.2007 00:42

Замечательно. Но, в целом, кто вообще дошел до использования данной штуки, и сам прекрасно понимает, что она все возвращает.


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

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