var list = [1, 2, 3, 4, 5];
for (var i = 0, len = list.length; i < len; i += 1) {
(function(i) {
setInterval(function() {
list[i] += 10;
console.log(i + "=>" + list[i] + "\n");
}, 5000)
})(i);
}
Вот рабочий код:
var list = [1, 2, 3, 4, 5];
for (var i = 0, len = list.length; i < len; i += 1) {
(function(i) {
setInterval(function() {
list[i] += 10;
console.log(i + "=>" + list[i] + "\n");
}, 5000)
})(i);
}
Здесь индекс i
хранится в анонимном функция, чтобы она не перезаписывалась последовательными циклами. Функция setInterval
в вашем коде сохраняет ссылку только на последнее значение i
.
Шаблон NSError **
используется, когда метод обычно возвращает некоторое значение, но вместо этого может потребоваться возврат объекта ошибки (типа NSError *
) в случае неудачи. В Objective-C метод может возвращать только один тип объекта, но это тот случай, когда вы хотите вернуть два. В языках типа C, когда вам нужно вернуть дополнительное значение, вы запрашиваете указатель на значение этого типа, поэтому для возврата NSError *
вам нужен параметр NSError **
. Более реалистичный пример:
// The method should return something, because otherwise it could just return
// NSError* directly and the error argument wouldn't be necessary
- (NSArray *)doStuffWithObject:(id)obj error:(NSError **)error
{
NSArray *result = ...; // Do some work that might fail
if (result != nil) {
return result;
} else {
// Something went bad!
// The caller might pass NULL for `error` if they don't care about
// the result, so check for NULL before dereferencing it
if (error != NULL) {
*error = [NSError errorWithDomain:...];
}
return nil; // The caller knows to check error if I return nil
}
}
Если бы у вас был только параметр NSError *
вместо NSError **
, тогда doStuff
никогда бы не смог передать объект ошибки обратно вызывающей стороне.
Все очень просто:
если вы передаете указатель на объект вашей функции, функция может изменять только то, на что указывает указатель.
если вы передаете указатель на объект указатель на объект, тогда функция может изменить указатель, чтобы он указывал на другой объект.
В случае NSError функция может захотеть создать новый объект NSError и передать вам обратно указатель на этот объект NSError. Таким образом, вам нужно двойное косвенное обращение, чтобы можно было изменить указатель.
Альтернативное утверждение того, что сказал n8gray:
Поскольку вы не получаете объект для отправки сообщений; вы создаете объект и возвращаете его. Обычно вам нужен аргумент указатель на переменную NSError *
, потому что вы можете использовать оператор return
только для одного элемента за раз, и вы уже используете его с НЕТ
.