반응형

기본 매개변수의 기초

매개변수를 입력하지 않았을 때, 매개변수를 강제로 초기화하는 것을 기본 매개변수(Default Parameter)라고 부릅니다. 단순하게 '매개변수가 undefined자료형이라면, 값을 넣는다'라는 형태로 구성하면 됩니다.

 

기본 매개변수 예

function test(a, b, c) {
    if(!b) { b = 52; }
    if(!c) { c = 273; }

    console.log(a + ' : ' + b + ' : ' + c);
}

test(1, 2); // 1 : 2 : 273

매개변수를 입력하지 않은 변수C에 273이 들어가기 때문에 위 코드처럼 출력됩니다.

매개변수를 입력하지 않으면 뒤에 있는 매개변수에 값이 입력되지 않는 것이므로, 뒤에 있는 매개변수에만 조건문을 사용합니다.

단, 조건문은 조금 복잡하기 때문에 짧은 조건문으로 초기화하는 것이 일반적입니다.

 

짧은 조건문을 활용한 기본 매개변수

짧은 조건문 바로가기

 

짧은 조건문을 사용한 코드 변경 예

function test(a, b, c) {
    b = b || 52;
    c = c || 273;

    console.log(a + ' : ' + b + ' : ' + c);
}

test(1,2); // 1 : 2 : 273

짧은 조건문을 사용해 변경해도 위와 같은 값을 출력합니다.

 

앞의 값이 없으면(undefined자료형이라면), 뒤의 값을 사용하기 때문에 활용할 수 있는 코드입니다. 많이 활용되는 코드입니다.

 

반응형
반응형

자바스크립트의 실행 순서

 

자바스크립트의 실행 순서 예

console.log("A"); // 1
setTimeout(() => {
    console.log("B"); // 3
}, 0);

console.log("C"); // 2

코드를 실행하면 무조건 A -> C -> B 순서로 실행합니다.

 

자바스크립트의 함수 중에는 웹 브라우저에 처리를 부탁하는 함수가 있습니다. 대표적으로 타이머 함수와 웹 요청 관련 함수가 있으며, 웹 브라우저가 처리하고 처리가 완료되는것을 자바스크립트에게 알려줍니다.

이런 함수들은 현재 실행중인 다른코드의 실행이 끝나기 전에는 실행되지 않습니다.

 

단위 실행 예

setTimeout(() => {
    console.log("Set Timeout"); // 실행되지 않음
}, 0);

while(true) {}

위 코드는 0초뒤에 console.log()를 실행시키라고 해두었지만 아래 다른 코드의 실행이 끝나지 않았기 때문에 출력되지 않습니다.

 


 

반복문과 콜백 함수

 

자바스크립트의 실행 순서와 관련된 문제 예

for(var i = 0; i < 10; i++) {
    setTimeout(() => {
        console.log(i); // 10이 10번 
    }, 0);
}

위 코드는 반복문이 끝나는 시점이기 때문에 0,1,2,3,... 순서로 실행되지 않고 10이 열번 반복되는 현상이 됩니다.

그렇기때문에 0,1,2,3,... 순서로 실행하기 위해서는 변수를 따로 복사해 두어야 합니다.

 

클로저를 활용한 해결 예

for(var i = 0; i < 10; i++) {
    (function(abc) {
        setTimeout(() => {
            console.log(abc);
        }, 0);
    })(i);
}

이렇게 하면 반복문을 실행하는 동안 클로저가 생성되어 변수 abc에 값을 저장할 수 있습니다.

 

forEach()메서드를 활용한 클로저 생성

let array = [0,1,2,3,4,5,6,7,8,9];

array.forEach((element, i) => {
    setTimeout(() => {
        console.log(element) // 0,1,2,3,4,5,6,7,8,9
        console.log(i) // 0,1,2,3,4,5,6,7,8,9
    }, 0);
});

forEach()메서드 또한 함수 내부에서 클로저가 만들어지므로 정상적으로 실행됩니다.

 

반응형
반응형

자바스크립트의 내장함수

자바스크립트는 자체적으로 몇가지 함수를 제공합니다. 이렇게 기본으로 내장된 함수를 내장함수라고 부릅니다.

 

타이머 함수

타이머 함수는 특정 시간에 특정 함수를 실행할 수 있게 하는 함수입니다.

 

타이머 함수

함수 설명
setTimeout(function, millisecond) 일정 시간 후 함수를 한 번 실행합니다.
setInterval(function, millisecond) 일정 시간마다 함수를 반복해서 실행합니다
clearTimeout(id) 일정 시간 후 함수를 한 번 실행하는 것을 중지합니다.
clearInterval(id) 일정 시간마다 함수를 반복하는 것을 중지합니다.

setTimeout()함수는 특정한 시간 후에 함수를 한 번 실행하고, setInterval()함수는 특정한 시간마다 함수를 실행합니다.

 

setTimeout()함수 예

setTimeout(function () {
    alert("3초 이후에 실행되는 경고창");
}, 3000);

setTimeout()함수는 한번만 실행하기 때문에 별다른 문제는 없지만, setInterval()함수는 지속적으로 실행하기 때문에 컴퓨터의 자원도 계속해서 소비하게 됩니다.

그렇기 때문에 타이머가 더이상 필요없게 될 때 타이머를 멈춰주어야 합니다.

타이머를 멈출때는 clearTimeout()함수, clearInterval()함수를 사용합니다.

 

setInterval()함수 예

var interval = setInterval(function() {
    console.log("1초마다 실행되는 함수" + new Date());
}, 1000);

setTimeout(function() {
    console.log("10초 뒤에 종료합니다.")
    clearInterval(interval);
}, 10000)

 


 

인코딩과 디코딩 함수

인코딩은 문자를 컴퓨터에 저장하거나 통신에 사용할 목적으로 부호화하는 방법입니다. 웹에서는 통신할 때 한글 같은 유니코드 문자가 오작동을 일으킬 수 있으므로 인코딩을 해야합니다. 문자를 부호화하는 것이 인코딩이고, 반대로 문자를 원래대로 되돌리는 것이 디코딩입니다.

 

인코딩과 디코딩 함수

함수 설명
escape() 적절한 정도로 인코딩합니다.
unescape() 적절한 정도로 디코딩합니다.
encodeURI(uri) 최소한의 문자만 인코딩합니다.
decodeURI(encodedURI) 최소한의 문자만 디코딩합니다.
encodeURIComponent(uriComponent) 문자 대부분을 모두 인코딩합니다.
decodeURIComponent(encodedURI) 문자 대부분을 모두 디코딩합니다.

'적절한'과 '최소한' 그리고 '대부분'의 차이점

 

escape()

  • 영문 알파벳과 숫자, 일부 특수문자(@, *, -, _, +, ., /)를 제외하고 모두 인코딩합니다.
  • 1바이트 문자는 %XX의 형태로, 2바이트 문자는 %uXXXX형태로 변환합니다.

encodeURI()

  • escape()함수에서 인터넷 주소에 사용되는 일부 특수 문자(:, ;, /, =, ?, &)는 변환하지 않습니다.

encodeURIComponent()

  • 알파벳과 숫자를 제외한 모든 문자를 인코딩합니다.
  • UTF-8인코딩과 같습니다.

 

인코딩과 디코딩 함수 예

var URI = "https://shiro21.tistory.com/100?category=안녕하세요";

var output = "";
output += 
`
escape()
${escape(URI)}

encodeURI()
${encodeURI(URI)}

encodeURIComponent()
${encodeURIComponent(URI)}
`

alert(output);

세가지 함수 모두 비슷한 기능을 수행하기 때문에 어떤 것을 사용해도 무방합니다.

:: encodeURIComponent()함수를 많이 사용합니다.

 


 

코드 실행 함수

자바스크립트는 문자열을 코드로 실행할 수 있는 특별한 함수를 제공합니다.

 

코드 실행 함수

함수 설명
eval(string) string을 자바스크립트 코드로 실행합니다.

eval()함수는 문자열을 자바스크립트 코드로 실행하는 함수입니다.

 

코드 실행 함수 예

var willEval = "";
willEval += "var number = 10;";
willEval += "alert(number);";

eval(willEval); // 10

eval()함수는 문자열을 자바스크립트 코드로 실행하는 함수이므로 eval()함수로 실행된 코드에서 정의한 변수도 활용할 수 있습니다.

하지만 그만큼 위험하기 때문에 사용을 자제하라고 하는 함수입니다.

 


 

숫자 확인 함수

자바스크립트에는 Infinity와 NaN이라는 숫자가 있습니다. 변수에 있는 숫자가 이런 숫자인지 확인할 때 사용합니다.

 

숫자확인함수

함수 설명
isFinite() number가 무한한 값인지 확인합니다.
isNaN() number가 NaN인지 확인합니다.

프로그래밍에서 대부분 0으로 숫자를 누나면 오류가 발생하면서 작동을 멈춥니다. 반면에 자바스크립트는 0으로 숫자를 나누면 infinity라는 값이 들어갑니다.

 

Infinity 예

var number = 1 / 0;
alert(number); // Infinity

 

isFinite()함수는 이러한 값을 구분하는 함수입니다. 함수의 이름 그대로 isFinite(유한한 수)면 true를 리턴합니다.

 

isFinite() 예

var number = 1 / 0;
alert(number + ' : ' + isFinite(number)); // Infinity : false

 

Infinity 값 비교 예

var value = -10 / 0;

if(value == Infinity) {
    alert("인피니티입니다.");
} else {
    alert("인피니티가 아닙니다."); // 실행
}

 

( 자바스크립트에는 Infinity변수가 있습니다. )

Infinity는 -Infinity와 Infinity로 나뉘기 때문에 무한대를 확인할 때는 반드시 isFinite()함수를 사용하는게 좋습니다/

 

NaN 값 비교 예

if(NaN == NaN) {
    alert("NaN은 NaN이다.");
} else {
    alert("NaN은 NaN이 아니다."); // 실행
}

( 자바스크립트에는 NaN변수도 있습니다. )

NaN은 자신을 비교할 수 없습니다. 따라서 NaN을 확인할 때는 반드시 isNaN()함수를 사용해야 합니다.

 

isNaN()함수 예

if(isNaN(NaN)) {
    alert("NaN은 NaN이다."); // 실행
} else {
    alert("NaN은 NaN이 아니다.");
}

이부분은 매우 중요한 내용입니다.

 


 

숫자 변환 함수

 

숫자변환함수

함수 설명
parseInt(string) string을 정수로 바꾸어줍니다.
parseFloat(string) string을 유리수로 바꾸어줍니다.

 

Number()함수의 단점 예

var won = '1000원';
var dollar = '1.5$';
alert(Number(won) + ' : ' + Number(dollar)); // NaN : NaN

Number()함수는 숫자로 바꿀 수 없으면 NaN으로 변환합니다.

 

parseInt()함수와 parseFloat()함수 예

var won = '1000원';
var dollar = '1.5$';
alert(parseInt(won)  + ' : ' + parseInt(dollar)); // 1000 : 1
alert(parseFloat(won)  + ' : ' + parseFloat(dollar)); // 1000 : 1.5

$1000같은 문자열은 앞에서부터 읽기 때문에 반환할 수 없습니다.

반응형
반응형

클로저(Closure)

클로저는 내부함수가 외부함수의 맥락에 접근할 수 있는 것을 가리킵니다. 클로저는 자바스크립트를 이용한 고난이도의 테크닉을 구사할 때 필수적인 개념으로 활용됩니다.

 

클로저에 대한 예제

 

지역 변수의 유효 범위 예

function test(name) {
    var output = "Hello " + name + ".. !!!";
}

alert(output);

위 코드는 오류가 있기때문에, 웹 페이지 오류를 발생시키거나 경고창을 출력하지 않습니다. 함수 안에 있는 변수는 지역변수이기 때문에 함수 외부에서 사용할 수 없습니다.

:: 지역변수는 함수가 실행될 때 생성되고 함수가 종료될 때 사라지기 때문입니다.

하지만 클로저를 사용하면 이러한 규칙을 위반할 수 있습니다.

 

클로저 사용 예 1

function test(name) {
    var output = "Hello " + name + "... !!!";
    return function() {
        alert(output);
    }
}

test("World")(); // Hello World... !!!

output은 지역변수이기 때문에 함수가 종료될 때 사라져야 합니다. 하지만 해당 변수가 이후에도 활용될 가능성이 있기 떄문에, 자바스크립트는 변수를 제거하지 않고 남겨둡니다. 따라서 위 코드처럼 Hello World... !!! 경고창이 출력됩니다.

 

클로저의 정의

  • 지역 변수를 남겨두는 현상
  • test()내부 변수들이 살아있는 것이므로 test()함수로 생성된 공간
  • 리턴된 함수 자체
  • 살아남은 지역변수 output

이렇게 클로저의 정의는 다양하기 때문에 느낌만 알아두면 편합니다.

 

클로저는 지역 변수 output을 남겨둔다고 외부에서 마음대로 사용할 수 있는 것은 아닙니다. 반드시 리턴된 클로저 함수를 사용해야 지역 변수 output을 사용할 수 있습니다. 클로저 함수로 인해 남은 지역 변수는 클로저 함수 각각의 고유한 변수입니다.

 

클로저 사용 예 2

function test(name) {
    var output = "Hello " + name + "... !!!";
    return function() {
        alert(output);
    }
}

var test1 = test("Web");
var test2 = test("World");

test1(); // Hello Web... !!!
test2(); // Hello World... !!!

위 코드는 호출해보면 각각 함수가 고유한 지역 변수 output이 있다는 것을 알 수 있습니다.

반응형
반응형

함수를 리턴하는 함수

 

익명 함수를 리턴하는 함수

function returnFunc() {
    return function() {
        alert("Hello World");
    }
}

returnFunc()(); // Hello World

returnFunc()함수를 호출하면 함수가 리턴되므로 괄호를 한번 더 사용해 해당 함수를 호출할 수 있습니다.

반응형
반응형

콜백함수

자바스크립트에서는 함수도 하나의 자료형이므로 매개변수로 전달할 수 있습니다. 이렇게 매개변수로 전달하는 함수를 콜백함수라고 합니다. 

 

익명함수를 매개변수로 전달 예

function callFunc(callbackTest) {
    for(var i = 0; i < 10; i++) {
        callbackTest();
    }
}

// 변수는 함수 호출보다 아래에 있으면 안됩니다.
var callbackTest = function() {
    alert('콜백함수');
}

callFunc(callbackTest); // 콜백함수 * 10

 

익명 콜백 함수 예

function callFunc(callback) {
    for(var i = 0; i < 10; i++) {
        callback();
    }
}

callFunc(function() {
    alert('함수 호출'); // 함수 호출 * 10
})

콜백 함수는 익명 함수로 사용하는 경우가 많습니다. 매개변수에 익명 함수를 곧바로 입력이 가능하다는 것을 알아둡시다.

 

반응형
반응형

내부함수

내부함수는 여러 개발자들과 프로그램을 개발할 때 충돌이 발생하는 것을 막는 방법입니다.

 

내부함수 형태

function <외부함수>() {
    function <내부함수1>() { <코드> }
    function <내부함수2>() { <코드> }

    <코드>
}

 

피타고라스의 정리 구현하기

// 제곱을 구하는 함수
function square(x) {
    return x * x;
}

// 피타고라스 함수
function pytha(width, height) {
    return Math.sqrt(square(width) + square(height));
}

alert(pytha(3, 4)); // 5

밑변과 높이를 매개변수로 받아 빗변의 길이를 리턴합니다.

 

이름 충돌 예

// 제곱을 구하는 함수
function square(x) {
    return x * x;
}

// 피타고라스 함수
function pytha(width, height) {
    return Math.sqrt(square(width) + square(height));
}

alert(pytha(3, 4)); // 0

// 삼각형이 직각인지 확인하는 함수
function square(width, height, hypotenuse) {
    if(width * width + height + height == hypotenuse * hypotenuse) {
        return true;
    } else {
        return false;
    }
}

위에서 만든 square()함수가 아래 square()함수에 덮어씌워지게 되면서 아래 square()를 사용하게 됩니다.

이를 방지하기 위해 다른 이름을 사용할 수도 있지만, 가변 인자 함수로 같은 이름이어도 다른 기능을 수행하게 하여 충돌 예방을 할 수 있습니다.

 

내부함수 사용 예

// 피타고라스 함수
function pytha(width, height) {
    // 제곱을 구하는 함수 (내부함수)
    function square(x) {
        return x * x;
    }
    return Math.sqrt(square(width) + square(height));
}

alert(pytha(3, 4)); // 5

// 삼각형이 직각인지 확인하는 함수
function square(width, height, hypotenuse) {
    if(width * width + height + height == hypotenuse * hypotenuse) {
        return true;
    } else {
        return false;
    }
}

이런식으로 내부함수를 사용하면 함수의 이름충돌을 예방할 수 있습니다. 하지만 반대로 내부함수를 외부에선 사용할 수 없다는 것을 알아두어야 합니다.

:: 내부함수는 내부함수를 포함한 외부함수에서만 사용이 가능합니다. ( 내부함수를 외부에서 개별적으로 사용이 불가능함 )

 

 

반응형
반응형

가변인자함수

가변 인자 함수는 매개변수의 개수가 변할 수 있는 함수입니다. 자바스크립트는 매개변수의 개수를 정의된 것과 다르게 사용해도 괜찮지만, 여기서 말하는 가변 인자 함수는 매개변수를 선언된 형태와 다르게 사용했을 때, 매개변수를 모두 활용하는 함수를 뜻합니다.

:: 이전에 봤던 Array()함수가 가변 인자 함수의 예입니다. Array함수 바로가기

 

sumAll()함수 형태 ( 매개변수로 입력된 숫자를 모두 더하는 함수 )

function sumAll() {

}

 

sumAll()함수 예

function sumAll() {
    alert(typeof(arguments) + ' : ' + arguments.length);
}

sumAll(1, 2, 3, 4, 5, 6, 7, 8, 9); // object : 9

arguments변수는 자바스크립트의 모든 함수 내부에 기본적으로 존재합니다.

:: arguments는 매개변수의 배열입니다.

배열은 객체 자료형이기 때문에 Object를 출력하고, 함수를 호출할 때 9개의 매개변수를 입력했기 때문에 arguments.length의 길이는 9를 출력합니다.

 

sumAll() 함수 예 ( arguments객체를 사용한 가변 인자 함수 )

function sumAll() {
    var output = 0;
    for(var i = 0; i < arguments.length; i++) {
        output += arguments[i];
    }
    return output;
}

alert(sumAll(1, 2, 3, 4, 5, 6, 7, 8, 9)); // 45

 


 

리턴 값

return키워드는 함수가 실행되는 도중에 함수를 호출한 곳으로 돌아가라는 의미입니다. 따라서 return키워드를 사용하면 값을 지정하지 않아도 함수를 호출한 곳으로 돌아갑니다.

 

return 키워드 예

function returnFunc() {
    alert('A'); // 실행됨
    return
    alert('B'); // 실행되지 않음
}

returnFunc();

return키워드를 alert('B')이전에 사용했기 때문에 실행되지 않고 함수가 종료됩니다. 따라서 A만 출력되는 것을 확인할 수 있습니다.

 

만약 아무 값도 받지않고 리턴하면 아무값도 들어있지 않기 때문에 아래처럼 'undefined'를 출력하게 됩니다.

 

아무값도 받지 않고 return했을 때 예

function returnFunc() {
    return
    alert('A'); // 실행됨
    alert('B'); // 실행되지 않음
}

var returnTest = returnFunc();
console.log(typeof(returnTest) + ' : ' + returnTest); // undefined : undefined

위처럼 아무값도 없기 때문에 undefined를 출력합니다.

 

반응형
반응형

매개변수

함수를 호출할 때 괄호 안에 적는 것을 매개변수라고 합니다.

 

리턴 값

함수를 호출하고 함수가 변환되는 값을 리턴 값이라고 합니다.

 

매개변수와 리턴 값을 갖는 함수 예

:: 모든 함수에 매개변수와 리턴 값을 사용하는 것이 아니라 필요한 경우에만 선택적으로 매개변수와 리턴 값을 사용합니다.

function <함수명>(<매개변수>, <매개변수>, <매개변수>) {
    내용
    
    return <리턴 값>;
}

함수 안으로 넣는 것을 매개변수, 함수의 결과로 나오는 것을 리턴이라고 생각하면 편합니다.

 

매개변수와 리턴 값 예

function hello(x) { return x * x; }

alert(hello(3)); // 9

 


 

( 좀 더 깊게 )매개변수란 ?

매개변수라는 이름은 함수를 호출하는 쪽과 함수를 연결하는 매개가 되는 변수로써 사용하게 된 것입니다.

자바스크립트는 함수를 생성할 때 함수에서 지정한 매개변수 개수보다 많거나 적은 매개변수를 사용하는 것을 허용합니다.

 

유효하지 않은 매개변수

alert('매개변수1', '매개변수2');

prompt('매개변수1');

alert

alert()함수는 매개변수를 하나만 사용할 수 있기 때문에 추가된 매개변수는 무시합니다.

prompt

prompt()함수는 원래 지정할 수 있는 매개변수 숫자보다 적게 선언했기 때문에 지정하지 않은 매개변수는 undefined처리가 됩니다.

 

일부 함수에서는 이렇게 지정한 매개변수보다 많거나 적게 매개변수를 사용하는 점을 이용하기도 합니다.

 


 

Array()함수

Array()함수는 기본적으로 매개변수에 아무것도 입력하지 않게 설계되어있습니다.

 

Array()함수 예

var array1 = Array();
var array2 = Array(10);
var array3 = Array(255, 244, 222, 132);

alert(array1 + '\n' + array2 + '\n' + array3);

Array()

Array()함수는 하나의 함수지만 매개변수를 어떤 방식으로 입력하느냐에 따라서 서로 다른 결과를 리턴합니다.

 

Array()함수의 매개변수에 따른 차이

함수 형태 설명
Array() 빈 배열을 만들어줍니다.
Array(number) 매개변수 값만큼의 크기를 가지는 배열을 만들어줍니다.
Array(any, ... ,any) 매개변수를 배열로 만들어줍니다.

 

반응형
반응형

함수란 ?

코드를 묶고 이름을 붙여 쉽게 재사용 할 수 있게 만든 것을 함수라고 합니다.

 

용어

  • 호출 : 함수 내부의 코드를 실행하는 것을 호출이라고 표현합니다.
  • 매개변수 : 함수에 자료 값을 넘기기 위해 사용하는 것을 매개변수라고 합니다.
  • 리턴 : 함수를 실행한 결과로 나오는 것을 리턴이라고 합니다.
  • 콜백 함수 : 함수의 매개변수로 함수를 전달할 때, 해당 함수를 콜백 함수라고 합니다.

 


 

익명 함수

익명함수는 함수 리터럴 방식으로 만들어진 이름이 없는 함수 입니다.

:: 함수 리터럴 = 이름이 붙어 있지 않은 자료를 의미합니다.

 

익명 함수 형태

var 함수 = function() {};

함수가 코드의 집합이라 말하는 이유는 괄호 내부에 코드를 넣기 때문입니다.

 

함수 생성과 출력 예

var hello = function() {
    var output = prompt('숫자를 입력하시오.', '숫자');
    alert(output);
}

alert(hello);

위 함수는 아래처럼 출력됩니다. 문자열처럼 보일 수 있지만 함수 자료형입니다.

함수

 

alert(hello);부분을 typeof연산자를 사용해서 출력했을 경우

방금 만든 function() {}형태는 함수지만 이름이 없기 때문에 '익명 함수'라고 부릅니다. 이름이 없기 때문에 변수에 넣어서 사용해야 합니다.

 

자바스크립트에서 함수는 하나의 자료형이지만 여타, 자료형과 다르게 뒤에 괄호를 열고 닫음으로써 코드를 실행합니다.

이렇게 함수를 실행하는 것을 '함수를 호출한다'라고 표현합니다.

 

함수 호출 예

var hello = function() {
    var output = prompt('숫자를 입력하시오.', '숫자');
    alert(output);
}

hello();

 


 

선언적 함수

선언적 함수는 익명함수와는 반대로 이름이 있는 함수라고 생각하면 편합니다.

따로 변수에 넣어줄 필요가 없고 선언할 때 붙여준 이름으로 호출을 하면 됩니다.

 

선언적 함수 형태

function 함수() {}

조금의 차이는 있지만 익명함수의 형태와 같은 기능을 수행합니다.

 

선언적 함수의 재정의

function hello() { alert('함수 A'); }
function hello() { alert('함수 B'); }

hello(); // 함수 B

이런식으로 같은 이름으로 선언적 함수를 사용하게 되면 뒤에 위치하는 함수가 실행됩니다.

 

익명 함수의 재정의

var hello = function() { alert('함수 A'); }
var hello = function() { alert('함수 B'); }

hello(); // 함수 B

익명함수 또한 기존의 변수를 덮어씌우므로 뒤쪽에 있는 변수를 사용해서 '함수 B'가 출력됩니다.

 

위처럼 '선언적 함수'와 '익명 함수'를 보면 차이가 없어보입니다. 

 

 

선언적 함수와 익명 함수의 차이점

 

선언적 함수의 재정의 2

hello(); // 함수 B

function hello() { alert('함수 A'); }
function hello() { alert('함수 B'); }

웹은 script태그 내부의 내용을 한 줄씩 읽기 전에 선언적 함수부터 읽습니다. 따라서 선언적 함수로 실행할 때는 3번째 줄 --> 4번째 줄 --> 첫번째줄 순서로 실행이 됩니다.

 

익명 함수의 재정의 2

hello();

var hello = function() { alert('함수 A'); }
var hello = function() { alert('함수 B'); }

반대로 익명 함수에서 변수를 먼저 사용하면 오류가 발생하여 실행되지 않습니다.

:: 변수를 선언하기 이전에 변수를 사용했기 때문입니다.

 

선언적 함수와 익명 함수의 순서

아래 코드를 실행하면 '함수 A'가 실행됩니다. 선언적 함수가 먼저 생성되고 익명 함수가 나중에 생성되었기 때문입니다.

 

선언적 함수와 익명 함수의 실행 순서 예

var hello = function() { alert('함수 A'); }
function hello() { alert('함수 B'); }

hello(); // 함수 A

실수하는 경우가 은근히 있기 때문에 잘 기억해 두어야 합니다.

반응형

+ Recent posts