원지의 개발
article thumbnail
728x90

함수

  • java script에서 함수는 1급 최상위 함수
  • 객체지향 프로그래밍 언어에서 훨씬 더 많은 기능을 함
  • 사용자 정의 함수 - 선언적 함수 & 익명 함수

선언적 함수

  • 이름 有
  • 접근제어자 X
  • return 값이 없을 수도 있음
    return 있으면 return 값 반환
    return 없으면 자동으로 undefined 반환 (자바의 void 개념)
  • 매개변수 없을수도 있음
  • hoisting(호이스팅): 함수 선언 이전에 호출해도 에러 발생 X (선언 이전 호출 해도 가능)

hoisting (호이스팅)

  • 함수를 변수에 저장 가능
  • 함수를 a에 저장할 때, 변수 선언 이후 호출 가능 - a에 저장하면서 호출X

익명 함수

  • 이름 無
  • 변수에 함수 데이터를 저장하여 변수를 함수처럼 사용 하도록 만들어 줌
  • hoisting(호이스팅) 사용 불가: 변수 선언 이후에 호출해야 함

더보기
<!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>
<body>
    
    <script>
        func1(); //호이스팅 (선언적 함수에서 가능) //값: func1 실행

        var result = func2(); //함수의 return
        console.log(result); //값: func2실행, func2 반환

        var result2 = func3(1, 2, 3);
        console.log(result2); //값: func3 실행, 6

        function func1() { //함수 선언
            console.log('func1 실행');
        }

        func1(); //함수 호출, 값: func1 실행

        function func2() {
            console.log('func2 실행')
            return 'func2 반환';
        }

        function func3(a,b,c) {
            console.log('func3 실행')
            return a + b + c;
        }

        //함수를 변수에 저장할 수 있습니다.
        var a = func1; //()하면 반환을 가져오겠다니까 넣어주면 안 됨
        console.log( typeof a ); //값: fuction
        a(); //a의 호출, 값: func1 실행
    </script>

</body>
</html>

argument - 함수의 가변 인자

  • js는 유연함: 매개변수는 큰 의미x, 단순히 인자 값에 들어오는 것에 이름을 붙이는 형태
method(1, 2, 3, 4, 5, 6, 7);

function method(a, b) {
	return a + b;
} // 에러 안남

// 쉽게 전달받아서 사용하기 위해 argument에서 매개변수를 언제든지 찾아쓸 수 있음
<!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>
<body>
    
    <script>
        function func1 (x, y) {
            console.log("매개변수의 길이:",arguments.length);
            console.log(arguments[0]);
            console.log(arguments[1]);
            console.log(arguments[2]);
            return x + y;
        }

        //매개변수 자체는 큰 의미가 없습니다. 단순히, 사용할 값에 이름을 붙이는 형태
        // console.log( func1(1) ); //NaN
        // console.log( func1(1, 2) );
        console.log( func1(1, 2, 3, 4, 5) ); //3
    </script>

</body>
</html>

즉시 실행 함수

  • 함수를 정의하고 바로 호출하는 함수
  • 사용이유? 페이지 시작 시 호출할 함수(초기화 할 값 지정할 때)를 기술

java script 변수 scope

  • java - { } 중괄호 스코프
  • java script - 함수 레벨 스코프(var), 블록 레벨 스코프(let)

js는 변수의 중복선언 가능
js는 함수 레벨 스코프여서 var변수를 전역변수와 지역변수로 나누는 기준은 함수
함수 안에서 정의된 var는 지역변수
나머지 var는 전역변수

전역변수 (global)

  • 전체적으로 어디서든 사용할 수 있는 변수

지역변수 (local)

  • (var 변수 기준) 함수 안에서만 사용가능한 변수
더보기
<!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>
<body>
    
    <script>
        //var변수의 유효범위는 함수이다. {}중괄호가 아님.

        var num1 = 50; //전연변수
        if(true) {
            var num2 = 100; //사라지지 않고 남아서 전역 취급
        }
        console.log(num2); //100

        var num3 = 100; //전역변수
        function add() {
            var num4 = 200; //함수 안에서 만들어진 것은 지역변수 취급
        }
        console.log(num4); //is not defined
        
        //es6 - let변수, 중괄호 스코프 (변수의 중복 선언 x)
        let x1 = 100;
        if(true) {
            let x2 = 200; //is not defined, 지역변수
        }
        console.log(x2);

        let x3 = 100; //전역변수
        function add2() {
            let x4 = 200; //지역변수
        }
        console.log(x4); //err
    </script>

</body>
</html>

Closure & lexical scoping

  • 클로저 환경이 아니면 함수 안의 var 변수를 밖에서는 절대로 손댈 수 없으나, 클로저 환경이라면 밖에서 사용 가능
  • 렉시컬 스코프는 함수의 선언위치에 따라서 접근할 수 있는 범위가 달라짐

밖에 있는 b = 1
안의 b = 10

  //lexical scoping(렉시칼 스코프) - 함수의 선언 위치에 따라서 상위 스코프를 결정하게 된다.

        var a = 1;
        function x() {
            a = 10;
            console.log(a); //
        }
        x();
        // console.log(x); 이렇게 안해도 된다....

        //비교 1
        var b = 1;
        function y() {
            var b = 10; 
            z();
        }
        function z() {
            console.log(b);
        } //1

         //비교 2
        var b = 1;
        function y() {
            var b = 10; 
            z();
            function z() {
                console.log(b);
            }
        } //10  

        
        y(); //실행

//클로저 - 내부함수를 이용해서 외부함수(a)의 변수의 접근할 수 있는 환경을 만들어준다.
        function func1() { //함수 안에
            var a = 1; //지역변수

            //1st
            // var b = function(){ //var a와 var b의 스코프가 동일하기 때문에 b에서 a사용 가능
            //     return a;
            // }
            // return b;

            //2nd
            return function() {
                return a; //내부함수(a)
            } //위와 같은 코드

        } //a의 범위는 요기까지
        
        // func1(); 
        // console.log(a); //err

        var result = func1(); //result는 내부함수
        var x = result();
        console.log(x); //x는 a값

        console.log('--------------------------------------------------------------------------');

        //클로저가 아닌 상황
        /*
        function compute() { //선언적 함수
            var count = 0;
            return ++count;
        }

        console.log(compute());
        console.log(compute());
        */

        //클로저 상황
        function compute() {
            var count = 0; //private 변수
            return function () { //이 부분이 내부함수, 밖에서 result2로 들어가는 부분
                return ++count;
            }
        }

        var result2 = compute(); //result2는 내부함수
        console.log(result2()); //count값에 대한 접근, 1나옴
        console.log(result2()); //2나옴
        console.log(result2()); //3나옴

<!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>
<body>
    
    <script>
        function obj() {
            var name = "홍길동";
            
            //get
            // return function() {
            //     return name;
            // }

            //set
            // return function (aaa) {
            //     name = aaa;
            //     console.log(name);
            // }

            return {
                getName : function() {
                    return name;
                },
                setName : function(aaa) {
                    name = aaa;
                }
            }
        }

        // var getobj = obj();
        // console.log(getobj()); //홍길동

        // var setobj = obj(); //setobj는 function임
        // setobj("이순신"); //이순신

        var result = obj(); //obj반환
        result.setName("이순신"); //setter
        console.log( result.getName() ); //이순신 나옴
    </script>

</body>
</html>

객체 (JSON)

  • JSON은 객체X, 객체 표기법인데 통상적으로 객체가 부른는 것
  • 객체는 { }로 표기 ( 중괄호 문법만 알아두면 됨 )
  • 함수로도 표기 가능
  • 자바처럼 try~catch 기능 있음

객체 접근방법

  • 객체 안의 객체 사용 가능 (아래 실습 예제 확인)

1) . 으로 접근

2) 이름[key] 를 이용한 접근

  • 문자 변수가 따로 없으니까 key를 적을 때 ' ' 넣기
<!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>
<body>
    
    <script>
        //객체의 표현 {}
        var person = {name: 'hong', age: 20, info: [1, 2, 3]};
        console.log(person)

        //객체의 접근방법이 2개 (둘 다 알기)
        //1st → .으로 접근

        console.log(person.name); //hong
        console.log(person.age); //20
        console.log(person.info); //[1, 2, 3]

        //2nd → 이름[키], key를 이용한 접근
        console.log(person['name']); //문자변수가 없으니까 key적을 때 ''넣어줘야 함, hong
        console.log(person['age']); //20
        console.log(person['info']); //[1, 2, 3]

        //객체 안에 객체
        var exam = {kor: 10, eng: 20};
        var kim = {name: '김길동', exam: exam};
        //kim이 가지고 있는 kor값의 사용?
        console.log(kim.exam.kor); //10
        console.log(kim['exam']['kor']); //10
        console.log(kim.exam['kor']); //10
    </script>

</body>
</html>

객체와 서버의 연결 (like 형변환)

  • 네티워크는 json을 모름 ▶ 객체를 주고받을 수 없음 ▶ jsocn형식으로 문자열로 바꿔줘야 함
  • 변환 해주는 메서드: stringify(), parser()
JSON ▶ 문자열
JSON.stringify(data);

문자열 ▶ JSON
JSON.parse("문자열");
// 엄격한 형식 필요: key, value 값이 전부 " "로 묶여야 함
  • JSON을 문자열로 변환하면 " "으로 만들어짐
  • 그리고 다시 JSON으로 변환하려면 " "인 상태에서 변환이 되어야 하기 때문에 객체의 값을 직접 지정하여 넣으려면
  • key와 value 값을 " "묶어줘야 함
  • 숫자는 " " 안해줘도 됨
<!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>
<body>
    
    <script>
        var data = [
            {id: 'aaa123', title: 'aaa', content: '...'},
            {id: 'bbb123', title: 'bbb', content: '...'},
            {id: 'ccc123', title: 'ccc', content: '...'}
        ];

        // console.log(data);
        // console.log(typeof(data));

        //JS객체를 JSON 문자열로 형변환
        var str = JSON.stringify(data);
        console.log(str); //문자열

        //JSON문자열을 JS객체로 형변환
        var obj = JSON.parse(str);
        console.log(obj); //객체

        //단, 문자열을 객체로 변경할 때는 엄격한 규칙이 있음
        //JSON을 문자열로 변환할 때 " "로 나타내기 때문에 문자열을 JSON으로 변환 할때도 " "가 들어가 있어야 함
        //key, value가 ""처리여야 함
        var result = JSON.parse('{"id": "aaa123"}');
        console.log(result); //객체
    </script>

</body>
</html>

오늘 하루

더보기

기억에 남는 부분

 

어려운 부분

 

문제 해결 부분

 

728x90
profile

원지의 개발

@원지다

250x250