Skip to content

Latest commit

ย 

History

History
103 lines (69 loc) ยท 5.3 KB

Strict_Mode.md

File metadata and controls

103 lines (69 loc) ยท 5.3 KB

Strict Mode๋ž€?

ํ•œ๊ตญ๋ง๋กœ ํ•˜๋ฉด ์—„๊ฒฉ๋ชจ๋“œ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰์„ ํ•˜๋Š” ๊ฒƒ์€ ๋น„-์—„๊ฒฉํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๋ง์ฒ˜๋Ÿผ ๋“ค๋ฆฐ๋‹ค.

๋น„-์—„๊ฒฉํ•˜๊ฒŒ๋ผ๊ณ  ํ•˜๋ฉด ์–ด๋–ค ๊ฒƒ์ด๊ณ  ์—„๊ฒฉํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์™œ ์ด๋Ÿฐ๋ชจ๋“œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ ๊ฒƒ์ผ๊นŒ?

์—„๊ฒฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๋Š์Šจํ•œ ๋ชจ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์˜์–ด๋กœ๋Š” sloppy mode๋ผ๊ณ  ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. (์•„๋Š”์‚ฌ๋žŒ์€ ๋งŽ์ง€ ์•Š๊ฒ ์ง€)

์—„๊ฒฉ๋ชจ๋“œ๋กœ ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ช‡๊ฐ€์ง€ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ํ•œ๋‹ค.

1. ๊ธฐ๋ณธ์—๋Š” ์กฐ์šฉํžˆ ๋ฌด์‹œ๋˜๋˜ ์—๋Ÿฌ๋“ค์„ `throwing` ํ•œ๋‹ค.
2. JS์—”์ง„์˜ ์ตœ์ ํ™” ์ž‘์—…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์‹ค์ˆ˜๋“ค์„ ๋ฐ”๋กœ ์žก๋Š”๋‹ค.(๊ฐ„ํ—์ ์œผ๋กœ ์—„๊ฒฉ๋ชจ๋“œ์˜ ์ฝ”๋“œ๋Š” ๋น„-์—„๊ฒฉ๋ชจ๋“œ์˜ ๋„์ผํ•œ ์ฝ”๋“œ๋ณด๋‹ค ๋”๋นจ๋ฆฌ ์ž‘๋™ํ•œ๋„๋ก ๋งŒ๋“ ๋‹ค๊ณ ํ•œ๋‹ค.)
3. ์—„๊ฒฉ๋ชจ๋“œ๋Š” `ECMAScript` ์˜ ์ฐจ๊ธฐ๋ฒ„์ „๋“ค์—์„œ ์ •์˜๋  ๋ฌธ๋ฒ•๋“ค์„ ๊ธˆ์ง€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ณ€ํ˜•์ด ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์—„๊ฒฉ ๋ชจ๋“œ๋กœ์˜ ๋ณ€ํ™˜(transitioning to strict mode)์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์—„๊ฒฉ๋ชจ๋“œ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ •๋ง๋กœ ๊ฐ„๋‹จํ•˜๋‹ค. ์ƒ๋‹จ์— "use strict"๋ฅผ ์ ์œผ๋ฉด ์ ์šฉ์„ ํ•œ ๊ฒƒ์ด๋‹ค. 'strict mode'๋Š” ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋ถ€๋ถ„ ํ•จ์ˆ˜์— ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ {}๊ด„ํ˜ธ๋กœ ๋ฌถ์—ฌ์ง„ ๋ธ”๋Ÿญ๋ฌธ์—๋Š” ์ ์šฉ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. {}๊ด„ํ˜ธ ์•ˆ์— 'strict mode'๋ฅผ ๋„ฃ์–ด๋„ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. eval์ฝ”๋“œ, function์ฝ”๋“œ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์†์„ฑ, windowTimters.setTimeout()์— ๋„˜๊ฒจ์ง„ ๋ฌธ์ž์—ด ๋“ค์ด ์ „์ฒด ์Šคํฌ๋ฆฝํŠธ์—์„œ 'strict mode' ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Strict ๋ชจ๋“œ

๋จผ์ € ์ „์ฒด์Šคํฌ๋ฆฝํŠธ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ "use strict"(๋˜๋Š” 'use strct') ๋ฅผ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์ž‘์„ฑ ์ „์— ์‚ฝ์ž…์„ ํ•œ๋‹ค.

// Whole-script strict mode syntax
'use strict';
var v = "Hi!  I'm a strict mode script!";

์—„๊ฒฉ ๋ชจ๋“œ์˜ ์Šคํฌ๋ฆฝํŠธ์™€ ๋น„-์—„๊ฒฉ ๋ชจ๋“œ์˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์—ฐ๊ฒฐ์€ ์‹ฌ์‚ฌ์ˆ™๊ณ  ํ•˜์‹œ๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. ์•ž์—์ฒ˜๋Ÿผ ํ•˜๊ฒŒ๋˜๋ฉด ์ „์ฒด ์—ฐ๊ฒฐ์€ ์—„๊ฒฉ์œผ๋กœ ๋ณด์ธ๋‹ค. ๋น„-์—„๊ฒฉ๊ณผ ์—„๊ฒฉ์˜ ๊ฒฐํ•ฉ์€ ๋น„-์—„๊ฒฉ์œผ๋กœ ๋ณด์ธ๋‹ค. ์—„๊ฒฉ ๋ชจ๋“œ์— ๋‹ค๋ฅธ ์—„๊ฒฉ๋ชจ๋“œ ๋“ค์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๊ณ  ๋น„-์—„๊ฒฉ ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„ ๊ดœ์ฐฎ๋‹ค. ๋‹ค๋งŒ, ์—„๊ฒฉ๊ณผ ๋น„-์—„๊ฒฉ์˜ ๊ฒฐํ•ฉ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์— ์˜ํ•œ ํ•จ์ˆ˜ ๊ธฐ์ค€์˜ ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์œ ๋ช…ํ•œ ์ด์Šˆ๋กœ ์•„๋งˆ์กด์—์„œ ์ด๊ฑธ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•จ์ˆ˜์— Strict ๋ชจ๋“œ ์ ์šฉํ•˜๊ธฐ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ•จ์ˆ˜์— strict mode๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ํ•จ์ˆ˜ ๋ณธ๋ฌธ ์ฒ˜์Œ์— ๋‹ค์Œ์˜ ๊ตฌ๋ฌธ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. "use strict"; (or 'use strict';).

function strict() {
  // ํ•จ์ˆ˜-๋ ˆ๋ฒจ strict mode ๋ฌธ๋ฒ•
  'use strict';
  function nested() { return "And so am I!"; }
  return "Hi!  I'm a strict mode function!  " + nested();}function notStrict() { return "I'm not strict."; }

์—„๊ฒฉ๋ชจ๋“œ๋กœ ์ „ํ™˜

์ž์„ธํ•˜๊ฒŒ ๋ณด๋ ค๋ฉด MDN ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏํ•˜๋‹ค.

๋‹ค์‹œ ๋„์ž…๋ถ€

"use strict" ๋Š” ES5์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋‚˜์˜จ directive ์ด๋‹ค. ์‹ค์ œ ์ˆ˜ํ–‰ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋ผ literal expression ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๋ฒ„์ „์˜ JavaScript ์—์„œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JavaScript ์ฝ”๋“œ ์ตœ ์ƒ๋‹จ์— ์ด "use strict"๊ฐ€ ์œ„์น˜ํ•˜๋Š”๋ฐ ์ด ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

"use strict" ๋ฅผ ์จ์•ผํ•˜๋Š” ์ด์œ 

"use strict" ์˜ ๋ชฉ์ ์€ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ strict mode ๋กœ ์‹คํ–‰๋˜๊ฒŒ ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” strict mode ๋ž€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋งŒํ•œ ๋ช‡๊ฐ€์ง€ ํŠน์ดํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ์—„๊ฒฉํ•œ ์ œํ•œ์ด ๊ฑธ๋ ค์žˆ๋Š” ์‹คํ–‰ context ๋ฅผ ์ง€์นญํ•œ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ "use strict" ๋ฅผ ์ด์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์™ธ์˜ ์˜ˆ๋กœ๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฆฌ์ŠคํŠธ์—์„œ ์ค‘๋ณต๋œ ๋ถ€๋ถ„์ด ์žˆ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋กœ๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด, jQuerylibrary ์ค‘๋ณต๋กœ๋”ฉ )

๊ฒฐ๋ก ์ ์œผ๋กœ ์ž ์žฌ์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๋ฅผ ๋ง‰์•„์ฃผ๋„๋ก ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฌธ๋ฒ• ์‚ฌํ•ญ์„ ์—„๊ฑฑํ•˜๊ฒŒ ์ง€ํ‚ค๋„๋ก ํ•˜๋Š” directive ์ •๋„๋กœ ์ธ์‹ํ•˜์‹œ๋ฉด ๋  ๋“ฏ ํ•˜๋‹ค.

Strict ๋ชจ๋“œ์˜ ์ œํ•œ ์š”์•ฝ

  1. ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ
  2. ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œ
  3. ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•œ ๋ฒˆ ์ด์ƒ ์„ ์–ธ
  4. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋™์ผ
  5. 8์ง„๋ฒ•์˜ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด๊ณผ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํ• ๋‹น
  6. ์ฝ๊ธฐ์ „์šฉ์— ํ• ๋‹นํ•˜๋ ค ํ•  ๋•Œ
  7. ์–ป๊ธฐ์ „์šฉ(get)์— ํ• ๋‹นํ•˜๋ ค ํ•  ๋•Œ
  8. ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•  ๋•Œ
  9. with ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ
  10. eval() ์„ ์‚ฌ์šฉํ•˜๋ ค ํ•  ๋•Œ

Reference