[JavaScript, CSS] 콜백, 콜백지옥

2022. 6. 3. 09:18·개발/html, css, js
728x90
반응형

1. 콜백함수

비동기 방식으로 작성된 함수를 동기 처리 하기 위해 주로 사용

비동기 처리를 기본적으로 하고 일부 구간에서 순차적인 처리가 필요할때 (API)

응답을 받은 다음에 처리해야 할때

 

(1)forEach

 //배열의 길이 만큼 돈다
 num.forEach(function(el,i){
     console.log(el);
     console.log(i);
 });

[1] 함수 전달

(1) 함수의 이름만 전달하는 방법

함수를 선언한 뒤에 함수 타입 파라미터를 맨 마지막으로 하나더 선언해준다.

 function myFun(test,callBack){
     //매개변수로 받은 text 보여줌
     console.log(test);
     //매개변수로 받은 콜백함수 사용
     callBack();
 }

 
 function callFun(){
    console.log("난 콜백");
    }

함수를 사용했고 첫번째 매개변수는 임의의 문자를 삽입

함수를 전달하는 부분은 우리가 함수를 사용할때 ()괄호를 붙이는데 ()괄호는 함수를 사용하겠다는 뜻이고,

콜백으로 함수를 전달할 때에는 ()괄호가 없이 함수의 이름만 전달하는 것

 

(2) 전역변수, 지역변수를 콜백함수의 파라미터로 전달

 

    //전역 변수를 선언
    let myName = "홍길동";

//매개 변수로 함수를 받을 함수를 만듬
function callBackFun(callBack){
    // 지역 변수 선언
    let youName = "허준";
    callBack(youName);
}

//매개 변수로 넘겨줄 함수
function callName(you){
    //매개 변수로 남길 함수를 선언해둔 myName 전역 변수를 사용하고
    // 자신이 받은 매개 변수 you를 사용한다.    
    console.log(myName + "이랑 " + you + "사이가 좋아")
};

//callBackFun 함수를 사용을 하는데 매개 변수로 callName함수의 이름을 전달
callBackFun(callName);

 

(3) class와 생성자 사용

 

class Con{
    constructor (name){
            this.name = name;
        }
        setname = function(firstName, lastName){
                this.name = firstName + " " + lastName;
            };
        }

         let _con = new Con("윤철");
        console.log(_con);
        _con.setname();
        let Con = {
           name : "홍길동",
            setname : function(firstName, lastName){
                this.name = firstName + " " + lastName;
            },
        }

        function getName(firstName, lastName, callBack){
            callBack(firstName,lastName);
            console.log(callBack)
            console.log(this);
        }

        getName("나 병현","나 윤철",Con.setname);
        console.log(Con.name);
        console.log(window.name)

우리가 getName이 함수에 전달한 callBack에게 변수에는 Con.setname의 함수가 전달이 되었는데

con.setname(); 이렇게 사용하면 this는 con객체이지만 getName함수에 getName의 이름으로 callBack함수를 전달해서

사용하면 this는 window객체이다.

 

[2] 실습

콜백함수 만들기

콜백함수 사용해서 네명의 이름을

전역변수와 지역변수로 출력하기

let nameArr = ["허준","홍길동","세종대왕"]
function callName(runFun,number){
    let array = "이이"
    runFun(array);
    console.log("총" + number + "명입니다.")
}

function arrayName(who){
    console.log("우리반 구성원" + (nameArr.length + 1) +"명 모두의 이름은 "+ who +","+ nameArr + "입니다")
}

callName(arrayName,4);

2. 콜백 지옥

 

function temp(num,callBack){
	let num1 = num * num;
    console.log(num1);
    callBack(num1);
}

temp(5,function(result){
	temp(result,function(result){
    	console.log("첫번째 지옥");
       	temp(result, function(result){
        	console.log("두번째 지옥");
        });
    });
});

[1] Promise 사용

Promise는 정상 수행 후 resolve, 실패 후 reject가 실행된다.

callBack을 사용했던 것과 같이 마찬가지로 resolve에 값을 담아 전달한다.

 

(1) Promise 지옥

function add(num){
	return new Promise((res,rej)=>{
    	let num1 = num + num ;
        console.log(num1);
        res(num1);
    });
});

add(5).then((result)=>{
	return add(result);
}).then((result)=>{
	return add(result);
}).the((result)=>{
	console.log("지옥탈출")
})

Promise를 사용하면 더 깔끔하게 지옥 가능

 

[2] setTimeout

function eat(){
    return new Promise(function(resolve){
        //setTimeout 밑에 쓴 숫자는 1000에 1초다
        //setTimeout은 밑의 시간 이후에 실행
        setTimeout(()=>{
            resolve("5초후 날 볼거야(작업완료)");
        }, 5000);//1000이 1초
    });
}
//await 처리 될때 까지 기다려줌
(async function(){
    var result = await eat(); //eat resolve가 될때까지 기다려
    console.log(result);
})();

[3] 실습

Promise로 10번 더하고 더한값을 6초뒤 출력

function add(num){
	return new Promise((res,rej)=>{
    	let num1 = num + num;
        console.log(num1);
        res(num1);
    })
}

	setTimeout(()=>{
    	add(5).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        }).then((result)=>{
        	return add(result);
        })
    },6000)

3. CSS

[1] 선택자

(1) 태그 선택자

 

div { color : red; } /*div선택자에 적용*/
p { color : black; } /*모든 p선택자에 적용*/

 

(2) ID 셀렉터

#name { color : red; } /*id 어트리뷰트가 name 인 서택자 적용, ID는 고유 , 중복불가*/

 

(3) 클래스 셀렉터

.content { color : red; } /*content 클래스를 가지고 있는 모든 요소 적용, 클래스는 동일명 가능*/

 

(4) 어트리뷰트 셀렉터

div[href] { color : red; } /*div에 href가 있는 모든 요소*/

 

(5) target

div[target = "black"] { color : red; } /*div에 target이 있는데 값이 blank인 요소*/

 

(6) 자식 선택자

.content .name { color : red; } /*content클래스의 자식요소인데 name클래스를 가지고 있는 요소*/

 

(7) 형제 셀렉터

.content + .content2 { color : red; } /*content 클래스의 같은 레벨의 형제 선택 요소*/

 

(8) 가상 클래스 셀렉터

a:hover { color : red; } /*a에 마우스를 올렸을때 일어나는 스타일*/
input:focus { color : red; } /*input이 포커스 상태일때 일어나는 스타일*/

 

(9) 다수의 클래스 선택자

 

.content.active { color : red; } /*content클래스도 가지고 있고 active클래스도 가지고 있는 요소*/

[2] 실습

nav에 버튼만들고 효과 주기

HTML

<!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>
    <link rel="stylesheet" href="03.reset.css">
    <link rel="stylesheet" href="03.style.css">
</head>
<body>
    <div class="nav">
        <button>햄버거</button>
    </div>
    <div id="slide"></div>
</body>
<script>
    document.querySelector(".nav button").addEventListener("click",function(){
        if(slide.classList.contains("active")){
            //"active"클래스가 있으면 제거
            slide.classList.remove("active");
        }
        else{
            //"active"클래스가 없으면 추가
            slide.className += "active";
        }
        console.log(slide.classList.contains("active"));
        //slide.classList.contains(클래스명) 클래스가 있으면 true 없으면 false
        
    })
</script>
</html>

CSS

body{
    /* body 선택자 */
    height : 100vh;
    /* 브라우저 전체 높이 */
    overflow: hidden;
    /* 자식요소가 이 태그 밖으로 나오면 hidden 효과를 준다 (숨긴다) */
}

.nav{
    /* nav라는 클래스 선택자  */
    width: 100%;
    /* width 태그의 넓이 */
    height: 50px;
    /* height 태그의 높이 */
    background-color: beige;
    /* background - color 태그의 배경색 */
    position: fixed;
    /* relative : 자신의 위치에서 이동할수 있다. */
    /* absolute : 부모를 기준으로 이동할수 있다.  */
    /* fixed : 브라우저를 기준으로 고정 : 스크롤에서 이동을 해도 위치가 변하지 않고 따라옴 */
    z-index: 1;
    /* z-index :position속성이 있어야하고 지정하지 않으면 0 같은레벨의 태그와 순서 정렬이 가능하다 */
}

.nav button{
    /* nav라는 클래스 자식에 태그 선택자  */
    width: 50px;
    height: 50px;
    background-color: red;
    transition: 1s; /* 태그의 속성이 바뀌면 바뀌는 시간*/
}

.nav button:hover{
    /* nav라는 클래스 자식에 가상 선택자  */
    width: 100px;
    height: 50px;
    background-color: blue;
}

#slide{
    position: absolute;
    top: 50px;
    left: 100%;
    width: 100%;
    height: calc(100% - 50px);
    /* calc 함수 (매개변수 안에 계산식을 작성) 계산된 값을 반환 */
    background-color: antiquewhite;
    /* borer 태그의 테두리 속성 첫번째는 테두리의 두께 두번째는 선의 속성 세번째는 색 */
    box-sizing: border-box;
    transition: 1s;
}

#slide.active{
    left:0;
}
728x90
반응형

'개발 > html, css, js' 카테고리의 다른 글

[HTML, JavaScript] 가위바위보, 일정 캘린더 만들기  (0) 2022.06.07
[JavaScript] 각종 이벤트  (0) 2022.06.07
[JavaScript] 배열 관련 문제 2개  (0) 2022.05.31
[JavaScript] 버블정렬, 선택정렬  (0) 2022.05.31
[JavaScript] Class  (0) 2022.05.30
'개발/html, css, js' 카테고리의 다른 글
  • [HTML, JavaScript] 가위바위보, 일정 캘린더 만들기
  • [JavaScript] 각종 이벤트
  • [JavaScript] 배열 관련 문제 2개
  • [JavaScript] 버블정렬, 선택정렬
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    블록체인
    React
    하이퍼레저
    mysql
    html
    컨테이너
    프로그래머스
    명령어
    30일챌린지
    30일 챌린지
    CSS
    go
    도커
    node.js
    go언어
    js
    erc20
    nodejs
    node
    ERC721
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[JavaScript, CSS] 콜백, 콜백지옥
상단으로

티스토리툴바