Javascript scopes

Scope determines the accessibility (visibility) of variables.

๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„

๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ

var a = 1;

function foo() {
    var b = 2;
    console.log(a);
    console.log(b);
}

foo();
console.log(b); // cannot access 'b'

foo() ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” a์™€ b์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, (๋‚ด๋ถ€์—์„  ์™ธ๋ถ€์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.) ์™ธ๋ถ€์—์„œ foo() ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ๋Š” var b์—๋Š” ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๋‹ค.

๋‚ด๋ถ€ ์™ธ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๊ธฐ์ค€์€ ํ•จ์ˆ˜ ์ด๋‹ค.

var a = 1;

function foo () {
    var a = 2;
    console.log(a);
}

foo();
console.log(a);

๋งˆ์ง€๋ง‰ ์ค„ console.log(a); ๋Š” 1์ด๋‹ค. ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€ var a = 2์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๊ณ  ํ˜ธ์ถœ๊ณผ ๋™์‹œ์— var a = 2๋Š” ์‚ฌ๋ผ์ง„๋‹ค. ๋ฟ…

function foo () {
    var a = 10;

    for (var i = 0; i < a; i++){
        console.log(i);
    }
    console.log(i); //๋งˆ์ง€๋ง‰ console.log(i); ์ฐ์€ ๋ถ€๋ถ„
}

foo();

for๋ฌธ์ด ๋๋‚˜๊ณ  ๋งˆ์ง€๋ง‰ console.log(i)๊ฐ€ ์ฐํžŒ ๋ถ€๋ถ„์—๋Š” 10์ด ๋‚˜์˜จ๋‹ค.

์™œ๋ƒํ•˜๋ฉด scope ๋ฒ”์œ„๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (var ๊ธฐ์ค€)

IIFE ์ดํ”ผ Immediately Invoked Function Expression ์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜

(function (){
    var a = 1;

    function foo () {
        var b = 2;
        console.log(a);
        console.log(b);
    }

    //foo();
})();

foo(); //์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์žˆ๋˜ ํ•จ์ˆ˜ ์‹คํ–‰

IIFE๋ฅผ ์ด์šฉํ•ด ๊ณ ์˜๋กœ ๋ฒ”์œ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ง€๋ง‰ foo(); ํ˜ธ์ถœ์€ error๊ฐ€ ๋œฌ๋‹ค. 'ใ…'/ {} ๋ฒ”์œ„๋ฅผ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 'ใ…' / ์˜ˆ~~

Global Scope, Global variable, Global Object

var a = 1;
function foo () {
    //bar function scope
    function bar() {
        //foo function scope
        console.log(a);
    }
    bar();
}
foo();

Scope chain

bar() -> foo() -> global ์ˆœ์œผ๋กœ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ„๋‹ค.

Global Object ๋Š” browser์—์„œ๋Š” window๋‹ค.

function์•ˆ์— var๋ฅผ ๋ถ™์ด์ง€ ์•Š์€ ๋ณ€์ˆ˜๋Š” Global์—๋‹ค ์ •์˜ํ•œ๋‹ค.

function foo () { b = 2 };
foo();

๋ผ๊ณ  ํ–ˆ์„ ๊ฒฝ์šฐ foo ์•ˆ์—๋Š” var๋ฅผ ๋ถ™์ด์ง€ ์•„๋‹ˆํ•˜์—ฌ์„œ ๋ณ€์ˆ˜ b๋Š” global์— ์ •์˜๋œ๋‹ค.

**global object์— key value๋กœ ๋ถ™๋Š”๋‹ค.

console.log(window.b) //2
function foo() {
    a = 1;

    function bar () {
        var a = 2;
        console.log(a);
    }
    bar();
}

foo();
console.log(a);

๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์˜ ๋‹จ์ 

var a = 'sla';
console.log(`[On Load] ${a}`);
setTimeout(function () {
    console.log(`[1 second] ${a}`);
}, 1000);

var a = 'sla2';
console.log(`[On Load] ${a}`);
setTimeout(function () {
    console.log(`[1 second] ${a}`);
}, 1000);

setTimeout ์œ„ ์•„๋ž˜ ์ „๋ถ€ sla2 ๊ฐ€ ๋œฌ๋‹ค. setTimeout์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ณ , ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ์ด์— ๋ณ€๊ฒฝ๋œ ๊ธ€๋กœ๋ฒŒ ํ•จ์ˆ˜๊ฐ€ ๋œฌ๋‹ค.

๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„๋Š” page์— 1๊ฐœ๋‹ค.

solution

function foo () {
    var a = 'sla';
    console.log(`[On Load] ${a}`);
    setTimeout(function () {
        console.log(`foo ํ•จ์ˆ˜์˜ [1 second] ${a}`);
    }, 1000);  
}

foo();

var a = 'sla2';
console.log(`[On Load] ${a}`);
setTimeout(function () {
    console.log(`[1 second] ${a}`);
}, 1000);

์ด๋ ‡๊ฒŒ foo()๋ผ๊ณ  ์“ด๊ฒƒ๋„ ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„์— ํฌํ•จ๋œ๋‹ค.

(function(){
    var a = 'sla';
    console.log(`[On Load] ${a}`);
    setTimeout(function () {
        console.log(`foo ํ•จ์ˆ˜์˜ [1 second] ${a}`);
    }, 1000);    
})()

var a = 'sla2';
console.log(`[On Load] ${a}`);
setTimeout(function () {
    console.log(`[1 second] ${a}`);
}, 1000);

์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š”๊ฒŒ ๋” ์•ˆ์ „ํ•˜๋‹ค.

Last updated

Was this helpful?