AS3 httpservice - передает аргументы обработчикам событий по ссылке - PullRequest
0 голосов
/ 10 апреля 2010

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

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), но если я сделаю это в замыкании, он будет передан по значению. Есть ли способ сделать это по ссылке без поиска в моем массиве объектов поиска значения, возвращенного в результате?

Ответы [ 2 ]

1 голос
/ 10 апреля 2010

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

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

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

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

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

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

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

0 голосов
/ 20 мая 2010

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

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

...