๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

20์žฅ strict mode ๋ณธ๋ฌธ

20.1 strict mode๋ž€?

  ์šฐ์„  strict mode๋ฅผ ์•Œ๊ธฐ์œ„ํ•ด์„œ๋Š” ์•”๋ฌต์  ์ „์—ญ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์•”๋ฌต์  ์ „์—ญ์ด๋ž€ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋งˆ์น˜ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์•”๋ฌต์ ์œผ๋กœ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ์‹๋ณ„์ž๋ฅผ ์ „์—ญ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋กœ ๋™์  ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด window ์ „์—ญ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ‘œํ˜„์€ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ „์—ญ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๋™์  ์ƒ์„ฑ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

function foo(){
    x = 10; // ์•”๋ฌต์  ์ „์—ญ์ด ์ƒ์„ฑ๋จ(์ „์—ญ ๊ฐ์ฒด window์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋œ๋‹ค.)
}
foo();

console.log(x); // 10

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

 

20.2 strcit mode์˜ ์ ์šฉ

  strict mode๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ์ „์—ญ์˜ ์„ ๋‘ ๋˜๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ์„ ๋‘์— 'use strict'; ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ „์—ญ์˜ ์„ ๋‘์— ์ถ”๊ฐ€ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด์— strict mode๊ฐ€ ์ ์šฉ๋œ๋‹ค

'use strict';

function foo(){
    x = 10; 
}
foo();

console.log(x); // ReferenceError (strict mode์—์„œ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.)

ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ์„ ๋‘์— ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์™€ ์ค‘์ฒฉ ํ•จ์ˆ˜์— strict mode๊ฐ€ ์ ์šฉ๋œ๋‹ค.

function foo(){
    'use strict';
    x = 10; 
}
foo();

console.log(x); // ReferenceError

์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ฝ”๋“œ์˜ ์„ ๋‘์— 'use strict';๋ฅผ ์œ„์น˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด strict mode๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

function foo(){
    x = 10; 
    'use strict';
}
foo();

console.log(x); // 10

20.3 ์ „์—ญ์— strict mode๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜์ž.

  ์ „์—ญ์— ์ ์šฉํ•œ strict mode๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‹จ์œ„๋กœ ์ ์šฉ๋œ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ๋‹จ์œ„๋กœ ์ ์šฉ๋œ strict mode๋Š” ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์— ํ•œ์ •๋˜์–ด ์ ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ strict mode ์Šคํฌ๋ฆฝํŠธ์™€ non-strict mode ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ผ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ „์—ญ์— strict mode๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

 

20.4 ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ strict mode๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ”ผํ•˜์ž.

  strict mode๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ํ•จ์ˆ˜๋Š” strict mode๋ฅผ ์ ์šฉํ•˜๊ณ  ์–ด๋–ค ํ•จ์ˆ˜๋Š” strict mode๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“  ํ•จ์ˆ˜์— ์ผ์ผ์ด strict mode๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์ด๋‹ค. ๋”ฐ๋ผ์„œ strict mode๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ผ ์Šคํฌ๋ฆฝํŠธ ๋‹จ์œ„๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

(function (){
    // non-strict mode        
    var num = 10; // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

    function foo(){
        'use strict';

        num = 20; // SyntaxError
    }
    foo();
}());

20.5 strict mode๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์—๋Ÿฌ

20.5.1 ์•”๋ฌต์  ์ „์—ญ

  ์„ ์–ธํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

(function (){
    'use strict';        
    num = 20; 
    console.log(num); // ReferenceError ๋ฐœ์ƒ
}());

20.5.2 ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ญ์ œ

  delete ์—ฐ์‚ฐ์ž๋กœ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.(delete ์—ฐ์‚ฐ์ž๋Š” ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ ์—ฐ์‚ฐ์ž๋‹ค.)

'use strict';

var i = 100;
delete i;
console.log(i); // SyntaxError ๋ฐœ์ƒ

20.5.3 ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ค‘๋ณต

  ์ค‘๋ณต๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

(function () {
    'use strict';

    function foo(x,x){  // Syntax Error ๋ฐœ์ƒ
        return x + x;
    }
    console.log(foo(1,2));
}());

 

20.5.4 with ๋ฌธ์˜ ์‚ฌ์šฉ

  with ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. with ๋ฌธ์€ ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋ฅผ ์Šค์ฝ”ํ”„ ์ฒด์ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. with ๋ฌธ์€ ๋™์ผํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ์ฒด ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•ด์ง€๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ์„ฑ๋Šฅ๊ณผ ๊ฐ€๋…์„ฑ์ด ๋‚˜๋น ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด with ๋ฌธ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.