2010-04-09 2 views
0

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

ответ

1

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

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

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

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

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

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

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

+0

Я хочу передать поиск onServerResponse. – Shawn

+0

Да, но я не понимаю, почему использование вашего подхода закрытия не будет работать. Возможно, вы хотите удалить объект поиска из своего массива, и в этом случае вам нужно получить доступ к массиву. В противном случае параметр поиска, который вы получите, является копией ссылки на исходный объект. Пока вы используете ссылку, вы получите доступ к исходному объекту. Итак, если вы хотите изменить значение объекта поиска или вызвать какой-либо метод на нем, у вас не должно быть проблем. –

+0

нет, я получаю ссылку на копию объекта, а не копию ссылки. – Shawn

0

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

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

Смежные вопросы