AS3 httpservice — передавать аргументы обработчикам событий по ссылке

У меня есть этот код:

var service:HTTPService = new HTTPService();
if (search.Location && search.Location.length > 0 && chkLocalSearch.selected) {
    service.url = 'http://ajax.googleapis.com/ajax/services/search/local';
    service.request.q = search.Keyword;
    service.request.near = search.Location;
} else
{
    service.url = 'http://ajax.googleapis.com/ajax/services/search/web';
    service.request.q = search.Keyword + " " + search.Location;
}
service.request.v = '1.0';
service.resultFormat = 'text';
service.addEventListener(ResultEvent.RESULT, onServerResponse);
service.send();

Я хочу передать объект поиска в метод результата (onServerResponse), но если я сделаю это в замыкании, он будет передан по значению. Есть ли способ сделать это по ссылке без поиска в моем массиве объектов поиска значения, возвращаемого в результате?


person Shawn    schedule 09.04.2010    source источник


Ответы (2)


Я не совсем уверен, что вы хотите сделать здесь.

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

Итак, если вы хотите разыменовать объект и изменить какое-то значение или вызвать для него какой-либо метод, все будет в порядке. Единственное, что не сработает, это изменение самой ссылки; то есть вы не можете обнулить его или назначить ему новый объект:

function dereferenceParam(param:Object):void {
    param.someInt = 4;
    param.someMethod();
}

function reassignParam(param:Object):void {
    param = null;
    //  or
    param = new Object(); 
}

dereferenceParam() будет работать так, как ожидает большинство людей, а reassignParam — нет.

Теперь единственная возможная «проблема», которая, как я думаю, у вас может возникнуть в соответствии с вашим последним абзацем, заключается в том, что вы хотите удалить или обнулить объект поиска из некоторого массива, который у вас есть. Боюсь, в этом случае единственным способом будет перебор массива.

person Juan Pablo Califano    schedule 10.04.2010
comment
я хочу передать поиск onServerResponse. - person Shawn; 10.04.2010
comment
Да, но я не понимаю, почему использование вашего подхода к закрытию не сработает. Я думаю, может быть, вы хотите удалить объект поиска из своего массива, и в этом случае вам нужно получить доступ к массиву. В противном случае параметр поиска, который вы получите, является копией ссылки на исходный объект. Пока вы используете ссылку, вы получите доступ к исходному объекту. Итак, если вы хотите изменить значение объекта поиска или вызвать для него какой-либо метод, у вас не должно возникнуть проблем. - person Juan Pablo Califano; 10.04.2010
comment
нет, я получаю ссылку на копию объекта, а не копию ссылки. - person Shawn; 28.04.2010

Как вы определяете, что получили копию объекта?

Насколько мне известно, (не внутренние) объекты почти никогда не копируются по значению. Единственным исключением являются отправленные объекты Event, но это явно задокументировано.

person Richard Szalay    schedule 20.05.2010