Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Какой смысл в Function.call() (http://www.flasher.ru/forum/showthread.php?t=181730)

Jarproger 30.06.2012 23:56

Какой смысл в Function.call()
 
Углубляясь в АС3, нашёл в справочнике

apply(thisArg:*, argArray:*):*
Указывает значение thisObject, используемого в любой функции, вызываемой ActionScript.
Function

call(thisArg:*, ... args):*
Вызывает функцию, представленную объектом Function.

Вот только смысла их я не понял... Функция вызывается просто через имя(аргументы)
И причём тут thisArg?

Psycho Tiger 01.07.2012 01:39

thisArg - устанавливает объект активации. Проще говоря, куда ссылается this. Для методов в AS3, слава богу, не работает.

У тебя есть метод method(a,b,c) и есть массив [0,4,6]. Ты можешь вызвать этот метод вот так:
Код AS3:

method.apply(null,arr);

С call - то же самое, только неограниченное количество параметров он берёт как массив.

a_[w] 01.07.2012 02:15

Они полезны, когда надо вызвать калбек имея при себе ссылку на сам метод, а не объект+имя_метода, да и передавать просто ссылку на метод удобнее. thisArg будет полезен если используешь не метод(который привязан к конкретному экземпляру), а анонимные функции/замыкания.
Код AS3:

var obj1:Object = {value:1};
var obj2:Object = {value:2};
var handler:Function = function():void{
        trace(this.value);
}
handler.apply(obj1); // 1
handler.apply(obj2); // 2


in4core 01.07.2012 02:48

Код AS3:

var obj1:Object = {value:1};
var obj2:Object = {value:2};
var handler:Function = function():void{
        trace(this.value);
}
handler.apply(obj1); // 1
handler.apply(obj2); // 2

Разница ?

Код AS3:

var obj1:Object = {value:1};
var obj2:Object = {value:2};
function getValue(o:Object) { trace(o.value) }
getValue(obj1); // 1
getValue(obj2); // 2

Ваш пример не раскрывает особого смысла

Добавлено через 1 минуту
Очень нужная вещь была в ас2, когда пользовались делигатом . в ас3 особого смысла не представляет

СлаваRa 01.07.2012 03:03

Цитата:

в ас3 особого смысла не представляет
если Вы пользуетесь сторонними твинами, то, например у гринсоксовских, есть параметры о которых Вам должно быть известно:
Код AS3:

onComplete:completeCallback, onCompleteParams:[...args]

вот простой пример где используются apply\call

ps: некогда придумывать еще какой-то пример

in4core 01.07.2012 03:37

СлаваRa я не говорю что этой методе нет применения, я лишь говорю, что ей почти не пользуются, примеров найти можно, но их оч мало

Psycho Tiger 01.07.2012 11:58

Цитата:

Ваш пример не раскрывает особого смысла
Давай тот, который раскроет. А потом объясни, в чем разница.

etc 01.07.2012 13:03

.call полезен.

ramshteks 01.07.2012 13:48

и своей "практики" могу привести пример, где Function.call полезен.

Представьте себе что у вас есть метод который принимает строку формата "something with %var%, %var%" и неограниченное количество параметров для подставления вот в такие форматы "%var name%"
и его сигнатура вот такая:
function printf(str:String, ...args:Array):String

и вот вам понадобилось этот самый метод завернуть в другой, например в нем вы описываете попытку взять эту саму str из xml. и этот метод для удобства имеет точно такую же сигнатуру:

function getVarByParams(varname:String, ...params:Array):String

только в его теле вы сталкиваетесь с тем, что передать ...params вы не можете просто передав как

printf(var_from_xml, params);

так как будет передан просто массив параметров первым элементом массива.
В этом случае Function.call может оказаться спасительным

printf.call(null, var_from_xml,params)

вызовет метод именно так как вы этого и ожидали.

etc 01.07.2012 13:54

ramshteks, всё круто, только это не про call.


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

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