AS3 не передает число по значению, а по ссылке? - PullRequest
1 голос
/ 27 сентября 2011

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

for (var i:int = 0; i < 3; i++) {
    var newChoice:MainButton = new MainButton(function(){
     trace(this["func" + i])} );
}

public function func0 ...
public function func1 ...
public function func2 ...

(При нажатии MainButton вызывает функцию в аргументе)

Однако я получаю func3, который, я полагаю, делает с ним поиск значенияиз я.Но не должен ли он пройти по значению, поскольку это число?Как получить желаемый результат?Спасибо

1 Ответ

4 голосов
/ 27 сентября 2011

Вы ничего не передаете, кроме самой функции (которая передается по ссылке).

То, что происходит, заключается в том, что функция создает замыкание вокруг переменной i, изменяя ее время жизни.Когда вызывается анонимная функция, i все еще находится в своей исходной области, но цикл уже завершен, оставляя i в 3.

Таким образом, закрытие по существу сохраняет i в областифункции даже после того, как первоначальное объявление функции завершилось.

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

for (var i:int = 0; i < 3; i++) {
    var j = i;       // New variable each time through the loop; closure will close over a different variable each time (that happens to have the same name)
    var newChoice:MainButton = new MainButton(function(){
        trace(this["func" + j])} );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...