2015-05-19 2 views
1

Я пытаюсь запустить этот фрагмент кода, но он говорит, что переменная a равна undefined, хотя, как вы можете видеть, я очень четко определил ее, и она должна быть глобальной переменной, так как она после каждой петлиглобальная переменная undefined после ее установки

var a = 1; 
var b = 2; 

window.setInterval(function(){ 
    alert(a); 
    if(a == 1){ 
     document.getElementById('pic2').style.opacity = '1'; 
     document.getElementById('pic1').style.opacity = '0'; 
     var b = 1; 
     var a = 2; 
    } 
    if(a == 2){ 
     document.getElementById('pic2').style.opacity = '0'; 
     document.getElementById('pic1').style.opacity = '1'; 
     var b = 2; 
     var a = 1; 
    } 
}, 2000); 
+1

Вы уверены, что это глобальная переменная? Если этот код находится в какой-либо функции (onload?), Тогда переменная не является глобальной из-за 'var' перед ней. Не говоря уже о том, что вы не меняете глобальный (если он глобальный), потому что вы снова используете 'var' для объявления нового локального. –

+0

нет его просто в начале страницы в тегах скрипта – user1899614

+1

Вы используете 'var' внутри функции. Это не глобально. –

ответ

7

Это потому, что вы обновляете свою переменную. Удаление vars из функции setInterval устраняет эту проблему.

var a = 1; 
var b = 2; 

window.setInterval(function(){ 
    alert(a); 
    if(a == 1){ 
     document.getElementById('pic2').style.opacity = '1'; 
     document.getElementById('pic1').style.opacity = '0'; 
     b = 1; 
     a = 2; 
    } 
    if(a == 2){ 
     document.getElementById('pic2').style.opacity = '0'; 
     document.getElementById('pic1').style.opacity = '1'; 
     b = 2; 
     a = 1; 
    } 
}, 2000); 
+1

Важным понятием здесь является «переменная подъем». Несмотря на то, что 'var a' меньше в функции, объявление локальной' a' поднимается, заставляя 'alert' предупреждать локальную (еще не определенную), а не глобальную. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting –

+0

Хотя этот фрагмент ответа на вопрос, они все еще не работают. В предупреждении всегда будет отображаться «1», и логика для изменения значения «a» внутри операторов if будет вызвана. – UsainBloot

+0

Это не работает, потому что это должно быть 'else if'. Когда 'a' равно 1, первый' if' изменяет его на 2, а второй 'if' затем выполняет его настройку на 1. –

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