프론트

JavaScript 변수, 함수, 입출력방법, 이벤트

짱코딩러 2022. 8. 30. 09:49

JavaScript : HTML과 CSS로 만들어진 웹페이지를 동적으로 변경해주는 언어

html->css->javascript 순서로 적용
 

변수

var : 값을 여러번 새로 넣을 수 있는 데이터(재선언, 재할당 가능)

var 변수 호이스팅 : 변수를 뒤에서 선언하지만, 마치 미리 앞에서 선언한 것처럼 인식(선언한게 자동으로 맨위로 올라감)

    var x = 10;
	function displayNumber() { 								
      console.log("x is " + x);
      console.log("y is " + y);      
      var y = 20;
		}
    displayNumber();
   →x is 10
    y is undefined	//변수가 밑에서 선언됐는데도 오류가 나는게 아니라 할당값이 없다고 뜸
    
//아래와 같이 인식하기 때문에
    var x = 10;
    function displayNumber() {
      var y;
      console.log("x is " + x);
      console.log("y is " + y);
      y = 20;
        }
    displayNumber();

 

let : let으로 변수를 선언한 경우, 이후에 let을 붙인 상태로 다른 값을 넣는것이 불가능하다.(재선언 불가. let 떼고는 가능)

  <script>
    function calcSum(n) {
      let sum = 0;
      for(let i = 1; i < n + 1; i++) {						
        sum += i;	
      }      
      sum = 100;    //여기에 var sum으로 적어주면 이미 선언된 변수라고 오류
      console.log(sum);
    }    
    calcSum(10);      
    console.log(sum); //이거 적으면 할당값 없다고 오류. sum은 지역변수임.
  </script>

 

const : 값을 한번 넣으면 바뀌지 않는 상수(재선언, 재할당 불가)

 

  → const를 기본적으로 쓰되 변경해야 하는 변수는 let으로 선언.(여러명이 사용할 때 변수의 값이 겹칠 수 있기 때문에)

 

변수 범위

1.전역변수

  : 전역변수는 함수 외부에서 선언된 변수로, 프로그램 전체에서 접근할 수 있는 변수

2.지역변수

  : 지역변수는 함수 내부에서 선언된 변수로, 함수가 실행되면 만들어지고 함수가 종료되면 소멸하는 변수

    함수 내에서만 사용할 수 있다. 

    var a="전역변수";
        
    function f1(){ 
        var a ="지역변수"; 	//var 없이 선언하면 지역변수 위치에 있어도 전역변수가 됨.
        document.write(a);
    }
    f1();

    document.write(a);

 

클로저

함수A가 함수a를 리턴하는 경우 함수A의 지역변수가 함수a에 의해 사용될 수 있음.

이런 경우에 함수A가 리턴되고나서도 지역변수가 사용되므로 함수를 종료할 수 없게 됨.

결국 함수A는 닫히지 않고, 지역변수의 범위가 연장 됨. 

    //함수A
    function f1(){
        var a =1;   //지역변수

        //함수a(클로저)
        return function f2(){   //f1()의 지역변수를 사용중임
            return a;
        }
    }

    var f = f1();   // f == f2()  →f가 함수를 참조하게 되므로 f는 함수처럼 사용됨.
    var b = f();    // f() == a   →f1()의 지역변수 a가 사용됨
    document.write(b);

 

 

자료형

*타입 확인 : typeof

let a = 13;
typeof a
  →'number'

 

String " ", ' ', ``

큰따옴표와 작은따옴표(구분X)를 이용해 감싸준다.

백틱(``)을 이용해 줄바꿈을 자유롭게 해줄 수 있고, 변수나 연산은 ${ }에 삽입해 표시해 줄 수 있다.

let numberA = 52;
console.log(`${numberA}은/는 ${numberA > 0 ? "0보다 큰" : "0 또는 0보다 작은"} 숫자입니다.`);


Number

var x = 3;
var x = new Number(3);


사칙연산 가능, 0으로 나누면 Infinity 출력
숫자가 아닌것과 나누거나 곱하면 NaN(not a number) 출력
문자형이랑 더하면 (숫자→문자형) 형변환 되어 연산 됨

Boolean

조건을 확인해서 조건이 맞으면 true, 맞지 않으면 false 출력


Null
null을 할당한 경우

어떤 값이 의도적으로 비어있음을 표현

undefined
변수를 할당하지 않고 선언만 한 경우

 

배열

여러 타입의 변수를 한번에 저장할 수 있음.

let array = [52, 273, '아침밥', '점심밥', true, false]

 

Date

https://dororongju.tistory.com/116

 

 

 

입출력 방법

alert(메세지)
알림 창. 메세지를 띄움(확인)


prompt(메세지 , 기본값)
프롬프트 창에서 값을 입력받음(텍스트필드) →문자형
디폴트값을 넣어둘 수 있음(생략 가능)

confirm(메세지)
확인 창. (취소/확인)=(true/false)

if (confirm('메세지')) {
	//확인 시 실행
} else {
	//취소 시 실행
}



→스크립트 일시정지, 스타일링 불가

 

document.write(메세지)

화면에 뿌려줌

 

명시적 형변환

String()
String(3) → "3"

Number()
Number("1234") → 1234
Number(true) →1
Number(false) →0
Number(0) →false
Number('0') →true
Number('') →false
Number(' ') →true
Number("문자") →NaN
Number(null) →0
Number(undefined) →NaN

 

Boolean()
0,"",null,undefined,NaN →false

 

**parseInt()는 문자열로 된 부분에서 숫자(정수)만 뽑아서 변환해주고, Number()은 문자열 전체가 숫자일때 소수점까지 숫자타입으로 가져올 수 있다.

 

 

연산자

** : 거듭제곱 연산자. 왼쪽 피연산자가 밑, 오른쪽 피연산자가 지수

=== : 타입까지 비교(가급적 이거 사용)

 

 

함수

반복시행해야 할 때 유용

//<java>
int add(int x, int y){
	return x+y;
}
//<javascript1>
var add = new Function("x,y", "return x+y;");
//<javascript2>
var add = funtion (x,y){
	return x+y;
}
//<javascript2>
function add(x,y){
	return x+y;
}

 

 

함수 선언식

function 함수명(매개변수1, 매개변수2,...){  }	//함수 선언문
//매개변수X
function showError(){
   alert('에러가 발생했습니다. 다시 시도해주세요.');
}
showError(); //시행댐

//매개변수O
function sayHello(name){
   const msg = `Hello, ${name}`;
   console.log(msg);
}
sayHello('Mike');
sayHello('Tom');

변수가 적용되는 범위(스코프)

지역변수 : 함수 안에서 var와 함께 선언

전역변수 : 함수 밖에서 선언 || 함수 안에서 var 없이 선언

 

 

함수 표현식

익명 함수(무명함수) : 함수 이름이 따로 없음. 변수에 할당할 수도 있고 다른 함수의 매개변수로 사용할 수도 있음.

호이스팅 적용 안됨.

var 변수명 = function( 매개변수 ) {
    실행문;
  };
//호출
변수명();	//함수 값이 출력됨 
console.log(변수명);	//함수 식 자체가 출력됨
console.log(변수명());	//함수 값 출력

 

즉시 실행 함수

(function (매개변수) {
    실행문
})(인수);

 

화살표 함수

(매개변수) => {함수 내용}
//1.기존 함수
const hi = function() {
  return alert("안녕하세요?");
}
//2.화살표 함수
const hi = () => alert("안녕하세요");

//1.기존 함수
let sum = function(a, b) {
  return a + b;
}
//2.화살표 함수
let sum = (a, b) => a + b;

 

인자와 매개변수

        //그냥 자바처럼 오버로딩하면 맨 마지막에 적어준 함수만 유효하게 됨
        //얘가 자바스크립트 재질로 만든 코드임
        //매개변수의 개수보다 인수가 더 적을 경우 넘어오지 않은 값은 undefined로 표시된다.
        function add(x, y, z) {
            var sum;
            if((y===undefined) && (z===undefined)) {
                sum=x;
            }
            else if(z===undefined) {
                sum=x+y;
            }
            else {
                sum=x+y+z;
            }
            return sum;  
        }
        var r1=add(2);       
        var r2=add(2, 3);       
        var r3=add(4, 5, 6);     
        document.write("함수 호출 인자 부족 : " + r1 + "<p/>");
        document.write("함수 호출 인자 부족 : " + r2 + "<p/>");
        document.write("정상적인 함수 호출 : " + r3 + "<p/>");

 

//arguments : 함수에 전달되는 인자들을 배열 형태로 나타낸 객체
//전달받은 인자의 수 만큼 for문이 반복됨.
 function add() {
            var i, sum=0;
            for(i=0; i<arguments.length; i++) {
                sum=sum+arguments[i];
            }
            document.write("수행 결과 : " + sum + "<p/>");  
        }
        add(2, 3);       
        add(2, 3, 4);     
        add(4, 5, 6, 7, 8);   
        add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

함수의 매개변수 개수와는 상관없이 넘겨진 값을 받는  'arguments'컬렉션이 있다.

 

 

 

이벤트

마우스 이벤트

click : 요소에 마우스를 클릭했을 때 이벤트가 발생

dbclick : 더블클릭했을 때

mouseover : 마우스를 요소 위로 올렸을 때

mouseout : 마우스가 요소 밖으로 벗어났을 때

mousedown : 마우스를 눌렀을 때

mouseup : 마우스를 뗐을 때

mousemove : 요소 위에서 마우스를 움직일 때

 

키보드 이벤트

keydown : 키를 누르는 동안

keyup : 키에서 손을 뗐을 때

keypress : 키를 눌렀을 때

 

문서 로딩 이벤트

abort : 문서가 완전히 로딩되기 전에 불러오기를 멈췄을 때

error : 문서가 정확히 로딩되지 않았을 때

load : 문서 로딩이 끝났을 때

resize : 문서 화면 크기가 바뀌었을 때

scroll : 문서 화면이 스크롤되었을 때

unload : 문서에서 벗어날 때

 

폼 이벤트

blur : 폼 요소에 포커스를 잃었을 때

change : 목록이나 체크 상태 등이 변경될 때. <input>,<select>,<textarea>태그에서 사용

focus : 폼 요소에 포커스가 놓였을 때

reset : 폼이 리셋되었을 때

submit : submit버튼을 클릭했을 때

 

 

이벤트를 객체와 연결하는 방식

인라인 방식(이벤트 타입별로 오직 하나의 이벤트 리스너만을 등록할 수 있음)

 : 이벤트가 발생할 때 실행

<태그 on이벤트명 = "함수명"></태그>
[1]
 객체.on이벤트명 = function() {  }
[2]
 function 함수명() {  }
 객체.on이벤트명 = 함수명

 

//클릭했을 때 alert 띄움
<li><a href="#" onclick="alert('버튼을 클릭했습니다.')">Green</a></li>

//클릭했을 때 changeBg('green')시행(색변경)
<li><a href="#" onclick="changeBg('green')">Green</a></li>
...생략...
<script>
		function changeBg(color) {
			var result = document.querySelector('#result');
			result.style.backgroundColor = color;
		}
</script>

 

 

DOM을 이용한 이벤트 처리기

 : 페이지가 읽혀질 때 실행

  - querySelector() : 하나의 태그만 선택(해당 선택자에 맞는 요소들 중 첫번째를 반환)

  - querySelectorAll() : 여러 개의 태그 선택(배열

<body>
 <button id="change">글자색 바꾸기</button>
 <p>내용내용내용내용내용내용</p>
  <script>
    // 방법 1 : 웹 요소를 변수로 지정 & 미리 만든 함수 사용
     var changeBttn = document.querySelector("#change");
     changeBttn.onclick = changeColor;  //이름 뒤에 괄호X
    
     function changeColor() {
       document.querySelector("p").style.color = "#f00";
     }
   
    // 방법 2 : 웹 요소를 따로 변수로 만들지 않고 사용
    document.querySelector("#change").onclick = changeColor;

     function changeColor() {
      document.querySelector("p").style.color = "#f00";
    }
    
    // 방법 3 : 직접 함수를 선언
     document.querySelector("#change").onclick = function() {
       document.querySelector("p").style.color = "#f00";
     };

 

addEventListener 방식

 

  - getElementById() : 주어진 문자열과 일치하는 id 속성을 가진 요소를 찾고, 이를 나타내는 Element 객체를 반환

  - getElementsByTagName() : 주어진 태그명과 일치하는 속성들을 배열로 가짐

  - getElementsByClassName() : 주어진 클래스명과 일치하는 속성들을 배열로 가짐

DOM객체. addEventListener(이벤트명, 실행할 함수명, 옵션)
<body>
  <button id="one">btn1</button>
  <button id="two">btn2</button>
  <button id="three">btn3</button>
   <script>
   const btn1 = document.getElementById("one")
    const btn2 = document.getElementById("two")
    const btn3 = document.getElementById("three")

    const handleClick = function () {
      console.log("저를 클릭하셨나요?");
    }

    //여러개의 핸들러를 추가할 수 있다.
    btn2.addEventListener('click', handleClick)
    btn2.addEventListener('click', function(){	//함수를 바로 입력해줄 수도 있음
      console.log("또 다른 핸들러가 추가 등록되었다!")
    })
    //핸들러 삭제
    //DOM객체. removeEventListener(이벤트명, 실행했던 함수명);
    btn2.removeEventListener('click',handleClick)

 

...생략...
    const handleClick = function (event) {
      console.log(event.target);
    }

    //.target은 이벤트가 발생하는 그 순간에 타겟을 알려주기 때문에 
    //같은 핸들러를 사용해도 다른 결과를 내준다.
    btn1.addEventListener('click', handleClick)
    btn2.addEventListener('click', handleClick)
    btn3.addEventListener('click', handleClick)