๐Ÿ“– strict mode

c_yjยท2022๋…„ 6์›” 27์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
17/42
post-thumbnail
function foo() {
  x = 10;
}
foo();
console.log(x) // ?

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

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

ESLint ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ESLint๋ฅผ ์‚ฌ์šฉํ•˜์ž.

โœ”๏ธ strict mode

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

'user strict';

function foo() {
	x = 10; // ReferenceError : x is not defined
}
foo();

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

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

์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ์„œ ์Šค์ฝ”ํ”„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์„ ๋‘์— strict mode๋ฅผ ์ ์šฉํ•˜์ž.

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์„ ๋‘์— strict mode ์ ์šฉ
(function () {
  'use strict';
  
  // Do something...
}());

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

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

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

โ˜‘๏ธ ์•”๋ฌต์  ์ „์—ญ

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

(function () {
 'use strict';
 
 x = 1;
 console.log(x); // ReferenceError: x is not defined
}());

โ˜‘๏ธ ๋ณ€์ˆ˜,ํ•จ์ˆ˜,๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ญ์ œ

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

(function () {
 'use strict';
 
 var x = 1;
 delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.
  function foo(a) {
    delete a; // SyntaxError: Delete of an unqualified identifier in strict mode.
  }
  delete foo; // SyntaxError: Delete of an unqualified identifier in strict mode.
}());

โ˜‘๏ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ค‘๋ณต

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

(function () {
 'use strict';
 // SyntaxError: Delete of an unqualified identifier in strict mode.
	function foo(x, x) {
      return x + x;
    }
  console.log(foo(1,2));
}());

โ˜‘๏ธ with ๋ฌธ์˜ ์‚ฌ์šฉ

with ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž

(function () {
  'use strict';
  // SyntaxError: Strict mode code may not include a with statement
  with({ x: 1}) {
    console.log(x);
  }
}());

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

โ˜‘๏ธ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ this

strict mode์—์„œ ํ•จ์ˆ˜๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ์„œ ํ˜ธ์ถœํ•˜๋ฉด this์— undefined๊ฐ€ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” 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); // {0:1, length: 1}
}(1));
  
profile
FrontEnd Developer

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