2015-12-06 3 views
0
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?
Я искал в Интернете, но не могу найти хороший ответ. Надеюсь, я смогу справиться с этим. Благодарю.

+0

Я новичок здесь в JavaScript. Пожалуйста, объясните мне самый простой способ. Многие Спасибо^_^ –

+0

Я знаю причину: закрытие (анонимная функция в этом примере) имеет доступ к переменным внешней функции по ссылке, а не по значению. но я до сих пор не понимаю, зачем получить id = 103 вещь. Я что-то пропустил? Спасибо –

+1

Да, это связано с закрытием. В 'celebrityIDCreator' вы сохраняете функции, и все эти функции будут использовать последнее значение' i'. Вы должны захватить i, чтобы иметь уникальный идентификатор для каждой звезды. Подробнее здесь: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1 – Shanoor

ответ

1

Это из-за закрытия. Читайте об этом here и here.

Это должно решить вашу проблему:

function celebrityIDCreator(theCelebrities) { 
    var i; 
    var uniqueID = 100; 
    for (i = 0; i < theCelebrities.length; i++) { 
     theCelebrities[i]["id"] = (function (index) { 
      return function() { 
       return uniqueID + index; 
      }; 
     })(i); 
    } 

    return theCelebrities; 
}; 
1

Причина в том, что вы используете функцию обратного вызова. Обратные вызовы должны выполняться после вызова. Таким образом, он будет выполнен, как только вы его назовете.

В вашем случае возврат вашего обратного вызова на каждой итерации всегда является последним значением i + uniqueID.

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