🐶 etc/2022기록

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

서카츄 2022. 10. 26. 14:16

 변수의 유효범위 (변수의 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>