• 함수의 기본 피라미터/리턴값/돔선택/반복문/이벤트연결/부모/자식/형제요소선택하기/DOM스타일제어

    2022. 10. 26.

    by. 서카츄

     변수의 유효범위 (변수의 scope)

    - 지역변수 : 블록안에서 선언된 변수 (해당 블록에서만 읽힘)
    - 지역변수를 쓰는 이유 : 특정 코드블록 안에서만 전용으로 쓰이는 정보값을 저장
    - 전역변수 : 블록밖에서 선언된 변수 (어디서든 읽힘)
    - 전역변수를 쓰는 이유 : 복수개의 함수나 코드블록안에서 특정 값을 공유해야될때

    호이스팅(hoisting)
    - 블록안에서 선언된 지역변수값이 블록바깥으로 강제로 끌어올라가져서 전역변수화
    - 일반함수 블록이 아닌 조건문, 반복문 안쪽에 있는 지역변수는 호이스팅이 발생

    함수의 종류
    - 선언적함수 : 함수의 호출위치가 자유로움 
     - 익명함수 : 함수의 이름이 없는 함수 (해당 함수만으로는 호출이 불가, 이벤트에 대입, 변수에 대입)
    - 대입형함수 : 변수에 익명함수를 대입하는 형태 (변수에 대입된 이후 호출가능)
    - 즉시실행함수 : 함수가 선언되자마자 자기 자신을 즉시 호출 (해당 함수의 코드블록을 캡슐화해서 호이스팅 방지)
    - 화살표함수(arrow function) : 기존의 대입형함수의 형태를 좀더 간결하게 표현한 구문

                                                    (this객체를 생성하지 않음- 객체지향 프로그램시 편리)

     

        plus(2, 3);
        //선언적 함수
        function plus(num1, num2) {
          console.log(num1 + num2);
        }
    
        //대입형 함수 (변수에 익명함수 대입)
        const minus = function (num1, num2) {
          console.log(num1 - num2);
        }
        minus(5, 2);
    
        //화살표 함수 (ES6)
        const divider = (num1, num2) => console.log(num1 / num2);
    
        divider(8, 2);
    
        //즉시실행 함수
        (function (num1, num2) {
          console.log(num1 * num2);
        })(2, 3);

    돔선택

    - 단일요소 선택
    const frame = document.querySelector('#wrap');


    - 복수요소 선택
    const boxs = document.querySelectorAll('#wrap>article');

     

    console.log(boxs[0]);
    console.log(boxs[1]);
    console.log(boxs[2]);

     

     

    for, 기본적인 반복문
    forEach, 배열, 유사배열에 쓸수있는 전용 내장함수

        const colors = ["red", "green", "blue", "aqua", "pink"];
    
            for (let i = 0; i < colors.length; i++) {
                console.log(colors[i]);
            }
    
            const classA = [
                {
                    name: "Andy",
                    age: 20,
                    address: "seoul"
                },
                {
                    name: "Andy1",
                    age: 30,
                    address: "Daegu"
                },
                {
                    name: "Andy2",
                    age: 40,
                    address: "Busan"
                },
            ];
    
            for (let num = 0; num < classA.length; num++) {
                console.log(classA[num].name);
            }

     

     

    map(es6) : 순수배열에만 쓸수 있는 전용 내장함수 (복사기능 포함: 불변성)
    for of : 배열전용 반복문

            const colors = ["red", "green", "blue"];
    
            for (let color of colors) {
                console.log(color);
            }
    
            for (let color of colors) console.log(color); //중괄호 생략가능


    for in   : 객체전용 반복문

            const student1 = {
                name: "david",
                age: 20,
                habby: "sports"
            }
    
            for (let key in student1) {
                console.log(key); //name, age, habby
                console.log(student1[key]); //david, 20, sports
            }

     


    for (let i = 0; i < boxs.length; i++) {
    console.log(boxs[i]);
    }

    //forEach, 배열, 유사배열 모두 반복처리 가능
    //반복기능만 있음
    boxs.forEach((el, idx) => {
    console.log('el', el);
    console.log('idx', idx);
    });

    const colors = ['red', 'green', 'blue'];
    //map,순수 배열만 반복처리 가능
    //반복을 돌면서 해당 배열값을 새롭게 복사해서 반환 (불변성 유지: immutable)
    colors.map((el, idx) => {
    console.log(el);
    console.log(idx);
    });

    for (const el of colors) {
    console.log(el);
    }

    const student1 = {
    name: 'David',
    age: 20,
    isFemale: false,
    address: 'Seoul',
    };
    for (const info in student1) {
    console.log(student1[info]);
    }

     


    while문

            const cars = ["bmw", "volvo", "hyundai"];
    
            for (let i = 0; i < cars.length; i++) {
                console.log(cars[i]);
            }
    
            let i = 0;
            while (cars[i]) {
                console.log(cars[i]);
                i++;
            }

    이터러블 객체

           const txt = "hello";
    
            for (let letter of txt) {
                console.log(letter);
            }
            
            //h e l(2) o

    이벤트 연결

    <body>
      <a href="#">버튼</a>
    
      <div class="box" style="width: 100px; height: 100px; background-color: aqua"></div>
    
      <ul>
        <li>button1</li>
        <li>button2</li>
        <li>button3</li>
        <li>button4</li>
        <li>button5</li>
      </ul>
    
      <script>
        const btn = document.querySelector('a');
        const box = document.querySelector('.box');
        const lis = document.querySelectorAll('ul li');
    
        /*
        btn.onclick = (e) => {
          e.preventDefault();
          console.log('엄청중요한 코드');
        }
    
        btn.addEventListener('click', (e) => {
          e.preventDefault();
          console.log('테스트코드')
        })
        */
    
        box.onmouseenter = () => {
          console.log('You mouseentered..');
        }
        box.onmouseleave = () => {
          console.log('You mouseleaved..');
        }
    
    
    
        lis.forEach((li, idx) => {
          li.addEventListener('click', () => {
            console.log(idx);
          })
        });
    
        //이벤트문과 함수 분리
        //선언적 함수 호출시 인수전달이 필요없는 경우
        //btn.addEventListener('click', test); 
        //선언적 함수 호출시 인수전달해야 되는 경우는 다시한번 wrapping 함수로 패키징해서 호출
        btn.addEventListener('click', () => test('Emily'));
    
        function test(name) {
          console.log('Hello ' + name);
        }
    
      </script>
    </body>

    부모,자식,형제요소 선택하기

    <body>
      <section>
        <article>box1</article>
        <article>box2</article>
        <article>box3</article>
    
        <ul>
          <li>button1</li>
          <li class="btn">button2</li>
          <li>button3</li>
        </ul>
      </section>
    
      <script>
        const section = document.querySelector('section');
        //직계 자식요소를 유사배열로 반환
        const article = section.children;
    
        //원하는 자식요소만 다시 querySelector로 탐색
        const ul = section.querySelector('ul');
    
        const btn = section.querySelector('.btn');
        console.log(btn);
    
        //현재요소기준 이전 형제요소
        console.log(btn.previousElementSibling);
    
        //현재요소기준 다음 형제요소
        console.log(btn.nextElementSibling);
    
        //현재요소기준 직계 부모요소
        console.log(btn.parentElement);
    
        //현재요소기준 조상요소
        console.log(btn.closest('section'))
    
      </script>
    </body>

    DOM스타일 제어

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <style>
        article {
            width: 200px;
            height: 200px;
            background-color: hotpink;
            margin: 50px;
            transition: 1s;
        }
    </style>
    
    
    <body>
        <button>getColor</button>
        <article></article>
    
    
        <script>
            /*
            기본적으로 DOM객체의 style값은 null로 비워져 있음
            style값을 수정해서 DOM의 스타일을 변경은 가능하지만
            일반 css로 적용되어 있는 원래 스타일값은 style 프로퍼티로 반환이 안됨
        
            getComputedStyle(DOM)
            - 기존 css에 연결되어 있는 스타일값을 구함
            - 실제 CSS파일에 접근해서 적용되어 있는 스타일값을 구하는게 아니라
            - 현재 브라우저에 랜더링되고 있는 스타일값을 다시 연산해서 해당 값을 반환
            */
            const box = document.querySelector('article');
            const btn = document.querySelector('button');
    
            box.addEventListener('click', () => {
                box.style.backgroundColor = 'aqua';
                box.style.transform = 'rotate(45deg)';
            })
    
            btn.addEventListener('click', () => {
                const bg = getComputedStyle(box)['background-color'];
                console.log(bg);
            })
        </script>
    </body>
    
    </html>

     

    댓글