๐Ÿธ [JavaScript] strict mode

hnyoojinยท2024๋…„ 9์›” 18์ผ

๐Ÿธ JS ๋งˆ์Šคํ„ฐ ๋˜๊ธฐ

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

strict mode๋ž€?

function foo() {
    // ์•„์ง ์„ ์–ธํ•˜์ง€ ์•Š์€ x์— ๊ฐ’ 10์„ ํ• ๋‹น
    x = 10;
}
foo();

console.log(x); // 10

์•„์ง ์„ ์–ธํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์ธ x์— 10์ด๋ผ๋Š” ๊ฐ’์„ ํ• ๋‹นํ–ˆ๋‹ค.

์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

JS ์—”์ง„์€, ๋ณ€์ˆ˜ x๊ฐ€ ์–ด๋””์—์„œ ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ์ฐพ์•„์•ผ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
scope chain์„ ํ†ตํ•ด์„œ ์„ ์–ธ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ผ๋‹จ foo ํ•จ์ˆ˜์˜ scope ์—์„œ ๋ณ€์ˆ˜ x์˜ ์„ ์–ธ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์„ ์–ธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—๋Š” ์‹คํŒจํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” foo ํ•จ์ˆ˜ ์ปดํ…์ŠคํŠธ์˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„์—์„œ ๋ณ€์ˆ˜ x์˜ ์„ ์–ธ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒ์œ„ ๊ทธ ์ƒ์œ„์—๋„ x๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

ReferenveError๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, JS ์—”์ง„์€ ์•”๋ฌต์ ์œผ๋กœ ์ „์—ญ ๊ฐ์ฒด์— x ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์  ์ƒ์„ฑํ•œ๋‹ค.
์ด๋•Œ ์ „์—ญ ๊ฐ์ฒด์˜ x ํ”„๋กœํผํ‹ฐ๋Š” ๋งˆ์น˜ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์ž‡๋‹ค.
์ด๋Ÿฐ ํ˜„์ƒ์„ ์•”๋ฌต์  ์ „์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋˜ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ๋ฐœ์ƒํ•˜๊ณ , ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์›์ธ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
๋”ฐ๋ผ์„œ var, let, const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ์— ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

๊ทธ๋Ÿฐ๋ฐ ์‹ค์ˆ˜๋กœ ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
์•„๋ฌด๋ฆฌ ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์—…์„ ํ•ด๋„ ์šฐ๋ฆฌ๋Š” ์ธ๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์—,, ์˜คํƒ€๋“ฑ์˜ ์‹ค์ˆ˜๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆญ ใ…ฃใ…†๋‹ค.

์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ES5๋ถ€ํ„ฐ๋Š” strict mode๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
strict mode : JS ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์„ ์ข€ ๋” ์—„๊ฒฉํžˆ ์ ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ฑฐ๋‚˜ JS ์—”์ง„์˜ ์ตœ์ ํ™” ์ž‘์—…์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆญ ใ…ฃใ…†๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์ธ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ชจ๋“œ..!

ESLint๊ฐ™์€ ๋ฆฐํŠธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด๋„, strict mode์™€ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
๋ฆฐํŠธ ๋„๊ตฌ๋Š” ์ •์  ๋ถ„์„ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์Šค์บ ํ•˜์—ฌ ๋ฌธ๋ฒ•์  ์˜ค๋ฅ˜๋งŒ์ด ์•„๋‹ˆ๋ผ ์ž ์žฌ์  ์˜ค๋ฅ˜๊นŒ์ง€ ์˜ค๋ฅ˜์˜ ์›์ธ์„ ๋ฆฌํฌํŒ…ํ•ด์ฃผ๋Š” ์œ ์šฉํ•œ ๋„๊ตฌ๋‹ค.


strict mode์˜ ์ ์šฉ

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

'use strict';

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

//----------------

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

//----------------

function foo() {
    x = 10;
    'use strict'; // 'use strict'๋ฅผ ์ฝ”๋“œ ์„ ๋‘์— ์œ„์น˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด?
}
foo();
// -> strict mode๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

์ „์—ญ์— ์ ์šฉํ•œ strict mode๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‹จ์œ„๋กœ ์ ์šฉ๋œ๋‹ค.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        'use strict';
    </script>
    <script>
        x = 1;
        console.log(x);  <!-- 1 -->
    </script>
    <script>
        'use strict';

        y = 1;			 <!-- ReferenceError: y is not defined -->
        console.log(y);
    </script>
</body>
</html>


์ด๋ ‡๊ฒŒ script ๋‹จ์œ„๋กœ ์ ์šฉ๋œ strict mode๋Š”, ๋‹ค๋ฅธ script์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ์— ํ•œ์ •๋˜์–ด ์ ์šฉ๋œ๋‹ค.

๊ทธ๋ž˜๋„ strict mode์™€ non-strict mode ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ผ์šฉํ•˜์ง€๋Š” ๋ง์ž
-> ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ...!

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์„ ๋‘์— strict mode ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
(funciton() {
    'use strict';
    
    // Do Something...
}());

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

strict mode๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ผ ์Šคํฌ๋ฆฝํŠธ ๋‹จ์œ„๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค


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

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

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

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

: delete ์—ฐ์‚ฐ์ž๋กœ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•จ

- ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ค‘๋ณต

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

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

: with ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•จ

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

์ด๋Ÿฐ ์ด์œ ๋กœ,, with ๋ฌธ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!


strict mode ์ ์šฉ์— ์˜ํ•œ ๋ณ€ํ™”

strict mode์—์„œ ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๋ฉด, this์— undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋จ

<- ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š”, this๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
-> ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this

(function () {
    'use strict';

    function foo() {
        console.log(this); // undefined
    }
    foo();

    function Foo() {
        console.log(this); // Foo {}
    }
    new Foo();
}());

- arguments ๊ฐ์ฒด

strict mode์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•˜์—ฌ ๋ณ€๊ฒฝํ•ด๋„,
arguments ๊ฐ์ฒด์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ

(function (a) {
    'use strict';
	
  	// ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•˜์—ฌ ๋ณ€๊ฒฝ
    a = 2;
  
	// ๋ณ€๊ฒฝ๋œ ์ธ์ˆ˜๊ฐ€ arguments ๊ฐ์ฒด์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
    console.log(arguments);
}(1));

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