๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript

[JavaScript] ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜

by soy๋ฏธ๋‹ˆ 2021. 9. 30.

 

 

 

 

 

๐Ÿ’ก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ์•Œ์•„๋ณด๊ธฐ

1. ๋‚ด๋ถ€ํ•จ์ˆ˜

2. ์ฝœ๋ฐฑํ•จ์ˆ˜

3. ๋ฆฌํ„ดํ•จ์ˆ˜

4. ํด๋กœ์ฆˆํ•จ์ˆ˜

5. ๋žŒ๋‹ค

6. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜

 

 

 

 

 

1. ๋‚ด๋ถ€ ํ•จ์ˆ˜

let f1 = function(){
    console.log('1');

    let f2 = function(){
        console.log('2');
    }
    f2();
}
f1();


f1 = function(){
    console.log('3');

    let f2 = function(){
        console.log('4');
    }
    f2();
}
f1();
// 1
// 2
// 3
// 4

 

  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ

 

2. ์ฝœ๋ฐฑํ•จ์ˆ˜

// ์ฝœ๋ฐฑํ•จ์ˆ˜
// fc = 
let f1 = function(fc){
    console.log('1');
    fc();   // f1 ํ•จ์ˆ˜์˜ ์ธ์ž fc๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ
}

let f2 = function(){
    console.log('2');
}

// ๋ฐฉ๋ฒ• 1
f1(f2);   // 1 , 2

// ๋ฐฉ๋ฒ• 2
f1(function(){
    console.log('3');
}); // 1 , 3

// ๋ฐฉ๋ฒ• 3
f1(() => {
    console.log('4');
}); // 1 , 4

 

  • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(์ธ์ž)๊ฐ€ ํ•จ์ˆ˜์ธ ํ˜•ํƒœ
  • ๋ถ€๋ชจ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ž์‹ ํ•จ์ˆ˜๋„ ๋ถˆ๋Ÿฌ์ง€๋Š” ํ˜•ํƒœ

 

 

3. ๋ฆฌํ„ดํ•จ์ˆ˜

// ๋ฆฌํ„ดํ•จ์ˆ˜
let f1 = function(){
    console.log('1');
    let f2 = function(){
        console.log('2');
    }
    return f2;  // return f2();
}
f1()();


let f3 = function(){
    console.log('3');

    return function(){
        console.log('4');
    };
}
f3()();

 

  • ๋ฆฌํ„ด ๊ฐ’์ด ํ•จ์ˆ˜์ธ ํ˜•ํƒœ
  • ๋ฆฌํ„ด๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ถ€๋ชจ ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋ฆฌํ„ด๋˜๋Š” ๋™์‹œ์— ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ ํ˜•ํƒœ
  • ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ f1()() ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

 

์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•ด์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜

(function(){
    console.log('1');
    return function(){
        console.log('2');
    }
})()();

 

 

 

4. ํด๋กœ์ €ํ•จ์ˆ˜

// ํด๋กœ์ฆˆ ํ•จ์ˆ˜
let f1 = function(){
    let a = 100;
    return function(){
        console.log(a);
    }
};

f1()();

 

  • ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ๋‹ค.
  • f1() ์ด ํ˜ธ์ถœ๋˜๋ฉด f1()์€ function()์„ ๋ฆฌํ„ดํ•˜๊ณ  ์†Œ๋ฉธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ๋ณ€์ˆ˜ a ๋ฅผ ๋”์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, f1() ๋‚ด์—์„œ ๋ฆฌํ„ด๋˜๋Š” function() ํ•จ์ˆ˜ ๋‚ด์—์„œ a๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , function() ํ•จ์ˆ˜๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ f1() ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธํ•˜๋”๋ผ๋„ ์ž์‹ ์ด ์„ ์–ธ๋œ ํ™˜๊ฒฝ์„ ๊ธฐ์–ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— (=> ํด๋กœ์ € ํ•จ์ˆ˜ ํŠน์ง•) f1() ๋ฐ–์—์„œ function()์„ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ๊ทธ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ์ง€์—ญ๋ณ€์ˆ˜ a๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

 

 

 

5. ๋žŒ๋‹ค

// ์˜ˆ์ œ 1
let f1 = function(a){
    console.log(a);
}
f1(1);

f1 = (a) => {
    console.log(a);
}
f1(2);

// (a) => { (b) => {} }

let f2 = (a) => {
    console.log(a);
    let f2 = (b) => {
        console.log(b);
    }
    f1(a+3);
}
f2(3);

// 1
// 2
// 3
// 6

 

// ์˜ˆ์ œ 2
((a) => {
    console.log(a);
    let f2 = (b) => {
        console.log(b);
    };
    return f2(a + 3);
})(3);

// 3
// 6

(function (a) {
    console.log(1);
    (function (b) {
        console.log(b);
    })(a);
})(4);

// 1
// 4

 

๋žŒ๋‹ค ํ˜•ํƒœ

// ๊ธฐ๋ณธํ˜•
((a) => {
    ((b) => {
    });
})();


// ๋ฐฉ๋ฒ• 1
(function (a) {
    (function (b) {
    });
})();


// ๋ฐฉ๋ฒ• 2
let f1 = function(fc){
    fc(10);
}

f1((( a ) => { 
    (( b ) => { 
        console.log(a+b);
    })(20)
}));


// ๋ฐฉ๋ฒ• 3
let f1 = () => {
    return 100;
}
let f2 = () => 100;
let f3 = () => {
    return console.log('1');
}
let f4 = () => console.log('1');
f4();  // 1

 

์ด์ค‘์• ๋กœ์šฐํ•จ์ˆ˜

// ์ด์ค‘ ์• ๋กœ์šฐ ๊ธฐ๋ณธํ˜•
let t = () => () => 100;

// ๋ณ€ํ˜• 1
t = () => () => {
    return 100;
}

// ๋ณ€ํ˜• 2
t = () => {
    return () => {
        return 100
    }
}
console.log(t()());                // 100

// ๋ณ€ํ˜• 3
t = (a) => {
    return () => {
        return 100 + a;
    }
}
console.log(t(10)());              // 110

// ๋ณ€ํ˜• 4
t = (a) => {
    return (b) => {
        return a + b;
    }
}
console.log(t(10)(20));            // 30

// ๋ณ€ํ˜• 5
t = (a) => {
    return (b) => a + b;
}

// ๋ณ€ํ˜• 6
t = (a) => {
    return (b) => a + b;
}
t = (a) => (b) => a + b;
t = a => b => a + b;  // ์ธ์ˆ˜๊ฐ€ 1๊ฐœ์ผ ๋•Œ๋Š” ๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ

// ๋ณ€ํ˜• 7
t = (a, c) => (b, d) => a * b + c * d;
console.log(t(1, 2)(3, 4));        // 11

 

 

 

6. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

 

๐Ÿ’ก ๋™๊ธฐ ๋ฐฉ์‹ (Synchronous)

  • ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๋‹ค์Œ ๋™์ž‘์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ์ฝœ์„ผํ„ฐ์˜ ์ผ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์žˆ๋‹ค. ์ฝœ์„ผํ„ฐ์˜ ์ง์›์€ ํ•œ ์†๋‹˜์˜ ์‘๋Œ€๋ฅผ ๋งˆ์นœ ํ›„์— ๋‹ค๋ฅธ ์†๋‹˜์„ ์‘๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ๋น„๋™๊ธฐ ๋ฐฉ์‹ (Asynchronous)

  • ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ํ•ด๋‹น ๋™์ž‘์˜ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋‹ค์Œ ์š”์ฒญ์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹
  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ ์ด๋ฉ”์ผ์ด ์žˆ๋‹ค. ํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋ƒˆ์„ ๋•Œ ๋‹ต๋ณ€์„ ๋ฐ›์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

setTimeout

// ๋น„๋™๊ธฐ ํ•จ์ˆ˜
console.log('1');
setTimeout(
    function () {
        console.log('3');
    },
    2000
)
console.log('2');

// 1 -> 2 -> 3

 

  • setTimeout ์œผ๋กœ 2์ดˆ ๋’ค์— ํ•จ์ˆ˜๋ฅผ ์ฝœํ•œ๋‹ค.
  • ์‹คํ–‰ ์‹œ 1์ด ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด 2์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆผ๊ณผ ๋™์‹œ์— 2๊ฐ€ ์ถœ๋ ฅ๋œ ๋‹ค์Œ 2์ดˆ๊ฐ€ ๋‹ค ํ๋ฅด๋ฉด 3์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

 

 

setInterval

let id = setInterval(
    () => {
        console.log('3');
        
    },
    2000 
 );
console.log('2');

// 2 -> 3 -> 3 -> 3 -> 3 ....

 

  • setInterval ์€ n ์ดˆ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ฝœํ•œ๋‹ค.
  • setTimeout ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

setTimeout & setInterval

let id = setInterval(
    () => {
        console.log('3');
        
    },
    2000 
 );
console.log('2');

setTimeout(
    () => {
        clearInterval(id);
        console.log('exit');
    },
    2000
)
console.log('2');

// 2 -> 2 -> 2-> 3 -> exit

 

  • setInterval ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  setTimeout ์œผ๋กœ setInterval ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

 

 

 

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜
for(let i=0; i<3; i++){
    (function(x){
        setTimeout(
            ()=>{ console.log(i); },
            1000
        )
    })(i)
}

// 0 -> 1 -> 2

 

  • ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ 1์ดˆ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

 

 

 

 

๋Œ“๊ธ€