function celebrityIDCreator(theCelebrities) {
var i;
var uniqueID = 100;
for (i = 0; i < theCelebrities.length; i++) {
theCelebrities[i]["id"] = function() {
return uniqueID + i;
};
};
return theCelebrities;
}
var actionCelebs = [
{ name: "Stallone", id: 0 },
{ name: "Cruise", id: 0 },
{ name: "Willis", id: 0 }
];
var createIdForActionCelebs = celebrityIDCreator(actionCelebs);
var stalloneID = createIdForActionCelebs[0];
console.log(stalloneID.id()); // 103
В предыдущем примере к моменту вызова анонимных функций значение i равно 3 (длина массива, а затем увеличивается). Число 3 было добавлено в уникальный идентификатор, чтобы создать 103 для ВСЕХ знаменитостейID. Таким образом, каждая позиция в возвращаемом массиве получает id = 103 вместо предполагаемых 100, 101, 102.закрытие javascript: недопустимые значения недочетов
Я прочитал статью функции обратного вызова, и когда я не могу добраться до этого предложения, я имею в виду, как объяснить, что мы всегда получаем идентификатор = 103?
Я искал в Интернете, но не могу найти хороший ответ. Надеюсь, я смогу справиться с этим. Благодарю.
Я новичок здесь в JavaScript. Пожалуйста, объясните мне самый простой способ. Многие Спасибо^_^ –
Я знаю причину: закрытие (анонимная функция в этом примере) имеет доступ к переменным внешней функции по ссылке, а не по значению. но я до сих пор не понимаю, зачем получить id = 103 вещь. Я что-то пропустил? Спасибо –
Да, это связано с закрытием. В 'celebrityIDCreator' вы сохраняете функции, и все эти функции будут использовать последнее значение' i'. Вы должны захватить i, чтобы иметь уникальный идентификатор для каждой звезды. Подробнее здесь: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1 – Shanoor