본문 바로가기
Frontend

07월 12일 금 | UI 화면구현 08 - Javascript 기초문법Ⅴ

by 구라미 2019. 7. 12.

 

Javascript 기초문법Ⅴ

13. Scope

자바스크립트의 스코프 

스코프는 변수의 유효범위를 말한다.

- Local Scope (지역변수)

- Global Scope (전역변수)

- Local Scope (지역변수) - Global Scope (전역변수)
function 내에 선언된 변수로 function 내에서만 사용가능

function외부에서 선언된 변수로 모든 function에서 사용가능

변수는 선언위치(전역 or 지역)에 의해 스코프를 갖게 된다. 

전역변수는 전역스코프를 갖는다.

지역변수는 지역스코프를 갖는다.

 

전역변수는 어느 곳에 위치해도 다 가져다 쓸 수 있다. 

그러나 그런 식의 코딩은 바람직하지 않음.

 

예시 1) 

 var one = "하나"; //전역변수
    function test1(){
      var uid="user"; //지역변수
      alert("ID:"+uid);
      //alert("Password"+upw); 에러
    }

    var two="둘"; //전역변수
    function test2(){
      var upw = "12345"; //지역변수
      alert("Password:"+upw);
      alert("하나:"+one);
      alert("둘:"+two);
      alert("셋:"+three);
      //alert("Password"+upw); 에러
    }

    var three="셋"; //전역변수

자바스크립트 변수 생애주기 확인하기

참고: https://poiemaweb.com/js-closure

14. setTimeout

자바스크립트

주어진 시간에 따라 자동으로 함수를 호출한다.

시간: 1000ms = 1 second.

setInterval("메소드명()", 시간) : 주기적으로 호출

setTimeout(메소드명, 시간) : 한번만 호출

 

시간해제:

clearInterval()

clearTimeout()

 

setInterval()

 

https://www.w3schools.com/jsref/default.asp

 

 

    //3초마다 반복적으로 경고창
    setInterval(function(){alert("Hello");}, 3000);

    //3초후 경고창 1번만
    setTimeout(function(){alert("Hello");}, 3000);

    //재귀적 함수 호출관계를 이용해서 3초마다 주기적으로 test함수 호출
    function test(){
      setTimeout(test, 3000);
    }

 

15. Javascript를 이용한 예제

 

브라우저에 디지털 시계 만들기

<!doctype html>
<html lang="ko">
 <head>
  <meta charset="UTF-8">  
  <title>디지털시계</title>
    <style>
    body {font-size: 16px; letter-spacing: -0.8px; text-align: center; font-family: 'Noto Serif KR';}
    .box { margin: auto; }
    #clock {font-size: 34px; padding: 20px 0;}
    hr {border: 1px dotted #ddd;}
    th {cursor: pointer;}
  </style>

</head>
<body onload="showtime()" onunload="killtime()">
  
<div class ="box">
  <h1>DIGITAL CLOCK</h1>
  <img src="https://images.unsplash.com/photo-1500145588304-deb802b4af76?ixlib=rb-1.2.1&auto=format&fit=crop&w=700&q=80" style="width: 300px;" alt="">
  <hr>
</div>

  <div id="clock"></div>
  <input type="button" name="" value="시작" onclick="showtime()"> 
  <input type="button" name="" value="중지" onclick="killtime()">

<script>
  
  function showtime(){
    var today = new Date();
    var str="";
    str += today.getFullYear()+".";
    str += today.getMonth()+1+""+".";
    str += today.getDate()+".";
    //요일
    switch(today.getDay()){
      case 1: str += "(Monday) "; break;
      case 2: str += "(Tuseday) "; break;
      case 3: str += "(Wednesday) "; break;
      case 4: str += "(Thursday) "; break;
      case 5: str += "(Friday) "; break;
      case 6: str += "(Saturday) "; break;
      case 7: str += "(Sunday) "; break;
    }
    //시각
    var hour =today.getHours();
    if(hour>12){
      str += "PM "+(hour-12)+":";
    } 
    else if(hour==12){
      str += "PM "+hour+":";
    }
    else {
      str += "AM "+hour+":";
    }
    str += today.getMinutes()+":";
    str += today.getSeconds();
    str += "<hr>";

     //html 삽입    
    document.getElementById("clock").innerHTML=str;

    //1초뒤에 showtime메소드 호출
    timer = setTimeout(showtime, 1000); //timer를 지정해주어야 한다. 

  }//function end

  var timer;

  function killtime(){
    //시간해제
    clearTimeout(timer); //시간반납

  }//killtime() end
</script>
</body>
</html>

 

 

브라우저에 디지털 계산기 만들기

 

<!doctype html>
<html lang="ko">
 <head>
  <meta charset="UTF-8">
  <link href="https://fonts.googleapis.com/css?family=Iceland&display=swap" rel="stylesheet">
  <title>디지털계산기</title>
    <style>
    body {background: #21222b;}
    .line {}
    .frm {margin: 50px;}
    .txt {border: 2px solid #888; border-radius:5px; text-align: right; font-family: 'Iceland', cursive; font-weight: bold; font-size: 32px; color: #000; width: 325px; height: 32px;}
    .txt:focus {border: 2px solid #ffd382;}

    .num {width: 85px; height: 50px; border: none; font-size: 20px; cursor: pointer;}
    .num:hover {background: #f5f5f5;}
    .numEnter {background: orange; width: 85px; height: 100px; border: none; font-size: 20px; cursor: pointer;}
    .numEnter:hover {background: #ffc04c;}
    .enter {background: orange; cursor: pointer;}
    .enter:hover {background: #ffc04c;}

    h1 {color:#fff;}
    tr {align-items: center; text-align: center; }
    td {width: 25%; height: 50px; border-radius: 5px; font-size: 18px;  background: #e8e8e8; }
    td:hover {background: #f5f5f5;}
   </style>

</head>
<body onkeydown="enter(event)">

  <div id="calculator"></div>
  <div class="frm">
     <h1>DIGITAL CACULATOR</h1>
     <form name="calcfrm" id="calcfrm">
    <table class="line">

    <tr class="row">
      <td colspan="4">
        <input type ="text" name ="result" id="result" size="" value="0" class="txt" readonly>
      </td>
    </tr>

    <tr class="row">
      <td><input type ="button" class="num" value="+" onclick="operator('+')"></td>
      <td><input type ="button" class="num" value="-" onclick="operator('-')"></td>
      <td><input type ="button" class="num" value="x" onclick="operator('*')"></td>
      <td><input type ="button" class="num" value="/" onclick="operator('/')"></td>       
    </tr>

    <tr class="row">
      <td><input type ="button" class="num" value="7" onclick="inputData(7)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="8" onclick="inputData(8)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="9" onclick="inputData(9)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="%" onclick="operator('%')"></td>           
    </tr>

    <tr class="row">
      <td><input type ="button" class="num" value="4" onclick="inputData(4)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="5" onclick="inputData(5)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="6" onclick="inputData(6)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="←" onclick="backspace(this.form)"></td>      
    </tr>

    <tr class="row">
      <td><input type ="button" class="num" value="1" onclick="inputData(1)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="2" onclick="inputData(2)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="3" onclick="inputData(3)" onKeyDown="onlyNumber(this)"></td>
      <td rowspan="2" class="enter"><input type ="button" class="numEnter" value="=" onclick="compute('=')"></td>
    </tr>

    <tr class="row">
      <td><input type ="button" class="num" value="0" onclick="inputData(0)" onKeyDown="onlyNumber(this)"></td>
      <td><input type ="button" class="num" value="." onclick="inputData('.')"></td> 
      <td><input type ="button" class="num" value="C" onclick="cls(this.form)"></td>           
    </tr>
  </table>
</form>
</div>
 

<script>
  function cls(f){
    //C버튼을 클릭하면 name=result 상자에 0을 대입.
    f.result.value=0;
  };

  function backspace(f){
    //입력된 숫자열을 String으로 생각하고 맨 뒷문자를 자르는 것이다.
    var str = String(f.result.value); //우선 입력된 값을 String으로 변경.
    f.result.value = str.substr(0,str.length-1); //String이 된 숫자의 맨 마지막 글자 자르기.
    if(str.length==1){ //왜 1인지는 모르겠음?
      f.result.value=0;
    }
  }


  function inputData(a){
    //전달받은 a변수값을 클릭할 때마다 추가.
    //name=result 상자에 출력.
    var f = document.calcfrm;
    f.result.value = Number(f.result.value+a); //0이 앞에 붙어 사라지지 않는 문제를 형변환으로 해결하였다.

  };

  // 두 수(의 값)를 넣고 -> 그 둘을 계산
  var num1; //사용자가 입력한 첫번째 수
  var num2; //사용자가 입력한 두번째 수
  var op;   //연산기호

  //전역변수를 선언하여 번갈아가며 사용.
  function operator(kind){
    //1)클릭한 연산기호를 op전역변수에 저장
    op=kind;

    //2)현재 name=result가 가지고 있는 값을 첫번째 수로 저장
    num1 = Number(document.calcfrm.result.value);
    
    //3)두번째수를 저장하기 위한 초기화가 필요하다.    
    document.calcfrm.result.value=0;

    //-> 이 다음은 compute()에 있음.    
  };

  function compute(){
    //4)현재 name=result가 가지고 있는 값을 첫번째 수로 저장
    num2 = Number(document.calcfrm.result.value);
    //5)두 수 연산하기.
    document.calcfrm.result.value=eval(num1+op+num2);

  }

</script>
</body>
</html>

 

 

 

댓글