Skip to content

Latest commit

Β 

History

History
228 lines (173 loc) Β· 6.34 KB

strict_mode.md

File metadata and controls

228 lines (173 loc) Β· 6.34 KB

ES5 ν‘œμ€€κΉŒμ§€ν•΄λ„ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ¬Έμ œκ°€ λ§Žμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 μ‹œκΈ°μ—λ„ 완성도 높은 ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ μ—¬λŸ¬ 방법을 κ°•κ΅¬ν–ˆμ£ . κ·Έ 쀑 ν•˜λ‚˜μΈ 엄격(strict) λͺ¨λ“œμ— λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.

strict mode

μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄μ˜ 문법을 μ’€ 더 μ—„κ²©νžˆ μ μš©ν•΄ 문제λ₯Ό λ‚΄ν¬ν•˜λŠ” μ½”λ“œμ— λŒ€ν•΄ λͺ…μ‹œμ  μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

λ‹€μ‹œ ν•œ 번 μƒκ°ν•΄λ΄…μ‹œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ μ–Έμ–΄μ˜ λ¬Έμ œμ μ€ 뭐가 μžˆμ—ˆμ„κΉŒμš”? λŒ€ν‘œμ μœΌλ‘œ 꼽자면 var ν‚€μ›Œλ“œ, λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…, 암묡적 μ „μ—­(Implict global) 등이 μžˆμ—ˆμ£ . 암묡적 전역에 λŒ€ν•΄ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄κ³  λΉ λ₯΄κ²Œ λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

  • 암묡적 μ „μ—­ : 아무리 봐도 μ—λŸ¬μΈ μ•„λž˜μ˜ μ½”λ“œλŠ” λ„ˆλ¬΄λ‚˜ 잘 μž‘λ™λ©λ‹ˆλ‹€.
    function foo() {
      x = 10;
    }
    foo();
    
    console.log(x); // 10
    • μ½”λ“œμ˜ 문제λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ˜ λ™μž‘ μˆœμ„œλ₯Ό μ‚΄νŽ΄λ³ΌκΉŒμš”
      1. foo ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•˜μ§€ μ•Šμ€ x λ³€μˆ˜μ— κ°’ 10을 ν• λ‹Ήν•©λ‹ˆλ‹€.
      2. x λ³€μˆ˜κ°€ μ–΄λ””μ—μ„œ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ μŠ€μ½”ν”„ 체인을 톡해 κ²€μƒ‰ν•©λ‹ˆλ‹€.
      3. foo μŠ€μ½”ν”„μ—μ„œ νƒμƒ‰ν•˜κ³ , μƒμœ„ μŠ€μ½”ν”„μΈ μ „μ—­ μŠ€μ½”ν”„μ—μ„œ x λ³€μˆ˜μ˜ 선언을 νƒμƒ‰ν•©λ‹ˆλ‹€.
      4. κ·Έ 어디에도 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ ReferenceErrorλ₯Ό λ°œμƒμ‹œμΌœμ•Όν•˜λ‚˜ 엔진은 λ™μ μœΌλ‘œ x ν”„λ‘œνΌν‹°λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
      5. μ „μ—­ 객체의 x ν”„λ‘œνΌν‹°λŠ” μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν˜„μƒμ΄ 암묡적 μ „μ—­μž…λ‹ˆλ‹€.

이 외에도 λ§Žμ€ 문제둜 인해 ES5μ—μ„œ strict mode(엄격 λͺ¨λ“œ)κ°€ μΆ”κ°€ λ˜μ—ˆμœΌλ©°, ESLint 같은 린트 λ„κ΅¬λ‘œλ„ 이λ₯Ό κ°•λ ₯ν•˜κ²Œ 검사할 수 μžˆμŠ΅λ‹ˆλ‹€.


strict mode μ μš©ν•˜κΈ°

μ „μ—­μ˜ 선두 λ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄ 선두에 'use strict';λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

  • μ „μ—­μ˜ 선두에 μž‘μ„± μ‹œ μ „μ—­ μŠ€μ½”ν”„μ— μ μš©λ©λ‹ˆλ‹€.

    'use strict';
    
    function foo(){
      x = 10; // ReferenceError: x is not defined
    }
    foo();
  • ν•¨μˆ˜ λͺΈμ²΄μ˜ 선두에 μž‘μ„± μ‹œ ν•΄λ‹Ή ν•¨μˆ˜ μŠ€μ½”ν”„μ—μ„œλ§Œ μ μš©λ©λ‹ˆλ‹€.

    function foo(){
      'use strict';
      x = 10; // ReferenceError: x is not defined
    }
    foo();
  • 선두가 μ•„λ‹Œ 곳에 μž‘μ„± μ‹œμ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

μ£Όμ˜μ‚¬ν•­

전역에 μ μš©ν•˜λŠ” 것은 ν”Όν•˜κΈ°

전역에 μ μš©ν•œ strict modeλŠ” 슀크립트 λ‹¨μœ„λ‘œ μ μš©λ©λ‹ˆλ‹€.

  • λ‹€λ₯Έ μŠ€ν¬λ¦½νŠΈμ— 영ν–₯을 주지 μ•Šκ³  ν•΄λ‹Ή μŠ€ν¬λ¦½νŠΈμ— ν•œμ •λ©λ‹ˆλ‹€.
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    
    <body>
      <script type="text/javascript">
      'user strict';
      </script>
      <script type="text/javascript">
      x = 1;
      console.log(x);
      </script>
      <script type="text/javascript">
      'user strict';
    
      y = 1;
      console.log(y); // ReferenceError: y is not defined
      </script>
    </body>
    
    </html>
    • 슀크립트 λ³„λ‘œ μ μš©ν•˜λŠ” 것은 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 특히 μ™ΈλΆ€ 라이브러리λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ”μš”.

ν•¨μˆ˜ λ‹¨μœ„λ‘œ μ μš©ν•˜λŠ” 것은 ν”Όν•˜κΈ°

μ–΄λ–€ ν•¨μˆ˜λŠ” strict mode, μ–΄λ–€ ν•¨μˆ˜λŠ” non-strict mode? λ‹Ήμ—°νžˆ λ°”λžŒμ§ν•˜μ§€ μ•ŠμœΌλ©°, κ·ΈλŸ°λ‹€κ³  λͺ¨λ“  ν•¨μˆ˜μ— 일일이 strict modeλ₯Ό μ μš©ν•˜λŠ” 것도 μ˜³μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • strict modeκ°€ 적용된 ν•¨μˆ˜κ°€ μ°Έμ‘°ν•  ν•¨μˆ˜ μ™ΈλΆ€μ˜ μ»¨ν…μŠ€νŠΈμ— strict modeλ₯Ό μ μš©ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    (function(){
      var x = 10;
    
      function foo(){
        'use strict';
    
        x = 20;
      }
      foo();
    }());
    • μ—λŸ¬κ°€ λ‚œλ‹€κ³  μ ν˜€μžˆλŠ”λ° μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λ„€μš”?πŸ™„ 무슨 일이지...

그럼 strict mode둜 μ½”λ“œλ₯Ό μ—„κ²©ν•˜κ²Œ κ΄€λ¦¬ν•΄μ„œ μΌμ–΄λ‚˜λŠ” 일은 뭐가 μžˆμ„κΉŒμš”?


strict modeκ°€ λ°œμƒμ‹œν‚€λŠ” μ—λŸ¬

암묡적 μ „μ—­, λ³€μˆ˜/ν•¨μˆ˜/λ§€κ°œλ³€μˆ˜μ˜ μ‚­μ œ, λ§€κ°œλ³€μˆ˜ 이름 쀑볡, withλ¬Έ μ‚¬μš© 등이 λŒ€ν‘œμ μž…λ‹ˆλ‹€.

암묡적 μ „μ—­

μ„ μ–Έν•˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ©΄ ReferenceErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.

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

λ³€μˆ˜/ν•¨μˆ˜/λ§€κ°œλ³€μˆ˜μ˜ μ‚­μ œ

delete μ—°μ‚°μžλ‘œ ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό μ‚­μ œν•˜λ©΄ SyntaxErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.

(function(){
  'use strict';
  var x = 10;

  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.
}());

λ§€κ°œλ³€μˆ˜ 이름 쀑볡

μ€‘λ³΅λœ 이름을 μ‚¬μš©ν•˜λ©΄ SytaxErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.

(function(){
  'use strict';

  function foo(a, a) {
    return a + a; // SyntaxError: Duplicate parameter name not allowed in this context
  }

  console.log(foo(1, 2));
}());

withλ¬Έ μ‚¬μš©

μ „λ‹¬λœ 객체λ₯Ό μŠ€μ½”ν”„ 체인에 μΆ”κ°€ν•˜λŠ” with문을 μ‚¬μš©ν•˜λ©΄ SyntaxErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€.

(function(){
  'use strict';

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

λ§ˆμ§€λ§‰μž…λ‹ˆλ‹€! strict modeλ₯Ό μ μš©ν•˜λ©΄ λ³€ν•˜λŠ” λ™μž‘μ΄ μ‘΄μž¬ν• κΉŒμš”? κ·Έ 닡은 μžˆμŠ΅λ‹ˆλ‹€μ΄κ³ , 이제 확인해 λ³Ό κ±°μ—μš”.


strict mode μ μš©μ— μ˜ν•œ λ³€ν™”

일반 ν•¨μˆ˜μ˜ this와 arguments 객체의 λ™μž‘μ΄ λ³€κ²½λ©λ‹ˆλ‹€.

일반 ν•¨μˆ˜μ˜ this

일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœν•˜λ©΄ this에 undefinedκ°€ λ°”μΈλ”©λ©λ‹ˆλ‹€. μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹Œ 일반 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” thisλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ΄μ£ .

(function(){
  'use strict';

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

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

arguments 객체

λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λœ 인수λ₯Ό μž¬ν• λ‹Ήν•˜μ—¬ 변경해도 λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

(function(x){
  'use strict';

  x = 10;
  console.log(arguments); // ArgumentsΒ [callee: (...), Symbol(Symbol.iterator): Ζ’]
}());