0

I am confusing about a scope concept, firstly I declared a let in global scope.

'use strict';

let secretNumber = Math.trunc(Math.random()* 20)+ 1;
let score = 20;
let highscore = 0;

and a game logic


document.querySelector('.check').addEventListener('click',function(){
   
    let guess = Number( document.querySelector('.guess').value);
  
    console.log(guess, typeof guess)
   
    if(!guess){
        document.querySelector('.message').textContent = ' Need a number!'
    }
    
    else if ( guess === secretNumber){
        document.querySelector('.number').textContent =secretNumber;
        document.querySelector('.message').textContent = ' Correct Answer ! '
        if ( score > highscore){
            highscore = score;
            document.querySelector('.highscore').textContent = score;
        }
    }
   
    else if(guess > secretNumber){
        if(score > 1) {
        
        document.querySelector('.message').textContent = ' Too High'
        score--;
        document.querySelector('.score').textContent = score}else {
        
            document.querySelector('.message').textContent='ou Lost The Game '
            document.querySelector('.score').textContent = '0'
        };
    }
    
    else if(guess < secretNumber){
        if(score > 1){
        
        document.querySelector('.message').textContent = ' Too Low'
        score--;
        document.querySelector('.score').textContent = score}
        else {
        
            document.querySelector('.message').textContent='You Lost The Game '
            document.querySelector('.score').textContent = '0'
        };
        ;
    }
})

I'm trying to implement a play again logic but keep the highest score.

document.querySelector('.again').addEventListener('click',function(){
    let score = 20;
    document.querySelector('.message').textContent = 'Start Guessin ....'
    document.querySelector('.guess').value = '';
    document.querySelector('.score').textContent = score;
    secretNumber = Math.trunc(Math.random()* 20)+ 1;
    document.querySelector('.number').textContent = secretNumber
})

I noticed I shadowing a let in the play-again function, so I'm confusing about three things:

i. Why re-declare a let in a function causing the whole block to fail when it's clearly two different functions.

ii. Why is my check function look for the let in my play again function ? Shouldn't it be only looking for the variable upward(parent / Global scope) ?

iii. what's the reason when I clicked the play again, the whole block will only looking for the newly declared variable and ignore the previous one and causing the high-score if else statement to fail?

Thank you guys in advanced if you're willing to help explain this concept.

p.s last question got closed, decided to post a new question and provide more details.

Trey
  • 1
  • 1
  • 2
    What do you mean when you say that it "failed"? What exactly happens? – VLAZ Jun 29 '21 at 19:00
  • You have added a lot of detail and to be honest the question gets a little overwhelming. Please check/confirm : 1. Is your score variable in check listener able to access the variable in again listener? This seems unlikely. 2. High score and secretNumber are the same variable throughout the code I hope you realize. – Tushar Shahi Jun 29 '21 at 19:17
  • Also in your 3 questions replace let with the actual variable you are referring. – Tushar Shahi Jun 29 '21 at 19:18
  • Yes, local variables shadow the outer scope variables with the same name, you can't expect the same variable mysteriously read your mind and hold a specific value you need in the different parts of the code. Functions are not reading variable values from inside of other functions, unless a function is defined inside of another function, and even in that case, a function can see the variables outwards only. See https://stackoverflow.com/questions/500431/what-is-the-scope-of-variables-in-javascript – Teemu Jun 29 '21 at 19:21

0 Answers0