Я просмотрел множество примеров, которые указывают, что это должно работать, но это не так. Мне было интересно, может ли кто-нибудь взглянуть и указать, почему. Я пытаюсь получить доступ к переменной «диа» из функции SetTimeout, но она всегда возвращает неопределенное значение:Область переменной в вложенных функциях в Javascript
var dialogue = new Array();
dialogue[0] = 'Hi there Mo, I am Mark. I will be guiding through the game for you today';
dialogue[1] = 'Hey there Mark, how you doing?';
dialogue[2] = 'I am doing fine sweetie pie, how about yourself?';
dialogue[3] = 'I am good too, thanks. Are you ready for today, i.e. the big day?';
dialogue[4] = 'I certainly am, Mark';
var dcount;
var loopDelay;
var diatext;
for(dcount = 0; dcount <= dialogue.length; dcount++) {
var dia = dialogue[dcount];
if(dcount == 0) { loopDelay = 0; } else {
loopDelay = ((dia.length)*1000)/18;
}
setTimeout(function() {
alert(dia);
diatext = Crafty.e('2D, DOM, Text')
.text(dia)
.textFont({ size: '11px', weight: 'bold' })
.attr({ x: 200, y: 150, w:400, h:300})
.css();
}, loopDelay);
}
Просто немного уточнить, почему вы видите " undefined ", если не закрывать 'dia', как TJ сделал выше, потому что до истечения таймаута ваша петля заканчивается, и вы застряли навсегда для доступа к диалогу [dialog.length + 1], который выходит за пределы. – MaxPRafferty
@MaxPRafferty: На самом деле 'dia' не ссылается на диалог [dialog.length + 1]', он ссылается на 'dialog [dialog.length]'. Но это все равно вне пределов. –
Спасибо за подробное объяснение! – emkay