PDA

Просмотр полной версии : Function.apply vs. Function.call


this.create
15.07.2007, 20:53
iNils: Тема образовалась из обсуждения темы Проблема с кодом (http://www.flasher.ru/forum/showthread.php?t=98511)

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

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

Kikasso
15.07.2007, 21:16
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
У 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
Без apply тяжело, а call я не знаю, где можно применить.
Если значение вдруг вернуть понадобится..

iNils
15.07.2007, 22:34
не попадает?
Можно например ввести _level0.mc1 или _root.txt
Я это знаю, но самого eval в байт коде нет, есть набор инструкций.

Если значение вдруг вернуть понадобится..Значение можно вернуть и обычным способом, фишка в том, что можно метод одного объекта применить к другому объекту.
_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
что из них более подходит диктует задача..
Можешь привести пример, когда apply не подходит? Вот пример с call пожалуйста, в Delegate (не родной, а мой) или Proxy, для передачи произвольного числа параметров, call ни как не подходит, ну только если не описать там тупо call (obj, a, b, c, d, e, ...)

Kikasso
15.07.2007, 22:52
Значение можно вернуть и обычным способом
Точно, возращает... Опять в хелпе косяк:

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
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
Я не вижу никакого смысла в данном топике.
Ну как нет, вот выяснили, что в хелпе написано, что apply ничего не возращает, а это не так :D

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