๐ŸŒˆ JavaScript hoisting

์ „์ฃผ์€ยท2022๋…„ 11์›” 9์ผ
1

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

๐Ÿค hoistinig

โœ” ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—...

Javascript์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜(function)๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜ ์„ ์–ธ์‹

        function ํ•จ์ˆ˜๋ช…(๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2 ..){
            ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ๋ฌธ์žฅ;
            ..
            return ๊ฐ’;
        }
    
        //ํ˜ธ์ถœํ• ๋•Œ
        ํ•จ์ˆ˜๋ช…(๊ฐ’1, ๊ฐ’2 ..);
  2. ํ•จ์ˆ˜ ํ‘œํ˜„์‹

        let ๋ณ€์ˆ˜๋ช… = function(๋งค๊ฐœ๋ณ€์ˆ˜1, ๋งค๊ฐœ๋ณ€์ˆ˜2 ..){
            ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ๋ฌธ์žฅ;
            ..
            return ๊ฐ’;
        }
        //ํ˜ธ์ถœํ• ๋•Œ
        ๋ณ€์ˆ˜๋ช…(๊ฐ’1, ๊ฐ’2 ..);

์ด ๋‘๊ฐœ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? 1๋ฒˆ์€ '์„ ์–ธ'๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— javascript๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋จผ์ € ์˜ฌ๋ ค ์„ ์–ธ ์ „์— ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์„ ํ•˜๋”๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ javascript์˜ hoisting์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


โœ” hoisting์˜ ์ •์˜

JavaScript์—์„œ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์„ ์–ธ ์ „์— ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•œ ํ›„, ์„ ์–ธ๋งŒ ์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ฒจ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์•ž์„œ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



โœ” hoisting์˜ ๋Œ€์ƒ

  • var ๋ณ€์ˆ˜ ์„ ์–ธ
  • ํ•จ์ˆ˜์„ ์–ธ๋ฌธ

let/const ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ํ‘œํ˜„์‹์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ  var ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ์•Œ์•„๋‘ฌ์•ผํ•˜๋Š” javasctipt์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค.


โœ” hoisting์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ์„ ์–ธ ์ฝ”๋“œ๊นŒ์ง€ ์‹คํ–‰ํ•ด์•ผ ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
//ํ˜ธ์ด์ŠคํŒ…๋จผ์ €! var ๋ณ€์ˆ˜ y์„ ์–ธ(undefined) -> x=1 (x์ดˆ๊ธฐํ™”) -> y=2; ์ดˆ๊ธฐํ™”
x = 1; 
console.log(x + " " + y); // '1 undefined'
var y = 2; 
console.log(x + " " + y);// '1 2'
  1. JavaScript๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ์ œ์™ธํ•œ ์„ ์–ธ๋งŒ ํ˜ธ์ด์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.
    - var๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ undefined๋กœ, ๊ทธ ์™ธ์—๋Š” ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ


โœ” ํ˜ธ์ด์ŠคํŒ… ๊ธฐ์ˆ  ์˜ˆ์ œ

JavaScript๋Š” ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ถ€ํ„ฐ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ์„ ์–ธ๋ณด๋‹ค ์•ž์„œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

catName("ํด๋กœ์ด");

function catName(name) {
  console.log("์ œ ๊ณ ์–‘์ด์˜ ์ด๋ฆ„์€ " + name + "์ž…๋‹ˆ๋‹ค");
}

์—๋Ÿฌ ์—†์ด ๊ฒฐ๊ณผ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 func1();
// func2();         //์—๋Ÿฌ๋œธ!
function func1(){
  alert('func1 ํ˜ธ์ถœ๋˜์—ˆ์Œ!');
}

const func2 = function(){
  alert('func2 ํ˜ธ์ถœ๋˜์—ˆ์Œ!');
}
func2();

func1์€ ํ˜ธ์ด์ŠคํŒ… ๋Œ€์ƒ์ด๋ผ ํ˜ธ์ถœ์„ ๋จผ์ € ํ•˜๋”๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ’์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!



์ด ๋ฌธ์„œ๋Š” ๊ตญ๋น„๊ณผ์ • ์ˆ˜์—…์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.
์ˆ˜์ •ํ•  ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!
์ฐธ๊ณ :https://developer.mozilla.org/ko/docs/Glossary/Hoisting

0๊ฐœ์˜ ๋Œ“๊ธ€