๐ 20์ฅ, strict mode
๐ ๋ฐฐ์ด ๋ด์ฉ ๋ฐ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
strict mode
1
2
3
4
5
6
function foo() {
x = 10;
}
foo();
console.log(x); // ?
์ด ์ฝ๋์์ console.log(x)์ ๊ฒฐ๊ณผ๊ฐ์ 10์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ฝํ ์ฒด์ธ์ ํตํด ์๋ณ์๋ฅผ ๊ฒ์์ ํ๊ธฐ ์์ํ๋๋ฐ ์์ ์ค์ฝํ์ x๊ฐ ์์ด x๋ฅผ ์ ์ญ ๋ณ์๋ก ์๋ฌต์ ์ ์ญ์ ์ ์ธํ๋ค.
์ฐธ๊ณ ๋ก ์ฐธ์กฐ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ์ด๋ ค์ด ๊ฐ๋ฐํ๊ฒฝ์ ๋ง๋ค๊ธฐ์ํด ES5๋ถํฐ
strict mode
๊ฐ ์ถ๊ฐ๋์๋ค. - strict mode(์๊ฒฉ ๋ชจ๋): ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์ ๋ฌธ๋ฒ์ ์ข๋ ์๊ฒฉํ ์ ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ๋๊ฑฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ต์ ํ ์์ ์ ๋ฌธ์ ์ํฌ ์ ์๋ ์ฝ๋์ ๋ํด ๋ช ์์ ์ธ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ๋ชจ๋
- ESLint๋ฅผ ์ฌ์ฉํ์ฌ๋ strict mode์ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์
- ESLint: ์ ์ ๋ถ์ ๊ธฐ๋ฅ์ ํตํด ์์ค์ฝ๋๋ฅผ ์คํํ๊ธฐ์ ์ ์์ค์ฝ๋๋ฅผ ์ค์บํ์ฌ ๋ฌธ๋ฒ์ ์ค๋ฅ๋ง์ด ์๋๋ผ ์ ์ฌ์ ์ค๋ฅ๊น์ง ์ฐพ์๋ด๊ณ ์ค๋ฅ์ ์์ธ์ ๋ฆฌํฌํ ํด์ฃผ๋ ์ ์ฉํ ๋๊ตฌ
- ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ฑ์ ํ์ผ ํํ๋ก ์ ์ํ๊ณ ๊ฐ์ ํ ์ ์์
- ํด๋์ค์ ๋ชจ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก strict ๋ชจ๋๊ฐ ์ ์ฉ๋จ
strict mode์ ์ ์ฉ
์ ์ญ์ ์ ๋ ๋๋ ํจ์ ๋ชธ์ฒด์ ์ ๋์
'use strict';
๋ฅผ ์ถ๊ฐ1 2 3 4 5 6
'use strict'; function foo() { x = 10; // ReferenceError: x is not defined } foo();
1 2 3 4 5 6
function foo() { 'use strict'; x = 10; // ReferenceError: x is not defined } foo();
์ฝ๋์ ์ ๋์ โ
use strict';
๋ฅผ ์์น์ํค์ง ์์ผ๋ฉด ์ ๋๋ก ๋์ํ์ง ์์
์ ์ญ์ strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ํผํ์
์ ์ญ์ ์ ์ฉํ strict mode๋ ์คํฌ๋ฆฝํธ ๋จ์๋ก ์ ์ฉ๋จ
์คํฌ๋ฆฝํธ ๋จ์๋ก ์ ์ฉ๋ strict mode๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ์ํฅ์ ์ฃผ์ง์๊ณ ํด๋น ์คํฌ๋ฆฝํธ์ ํ์ ๋์ด ์ ์ฉ๋จ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<!DOCTYPE html> <html> <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>
strict ์คํฌ๋ฆฝํธ์ non-strict ์คํฌ๋ฆฝํธ๋ฅผ ํผ์ฉํ๋ ๊ฒ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ์ ์์
์ธ๋ถ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ non-strict mode์ธ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฆ์ ์คํ ํจ์๋ก ์คํฌ๋ฆฝํธ ์ ์ฒด๋ฅผ ๊ฐ์ธ ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ๊ณ ์ฆ์์คํ ํจ์ ์ ๋์ strict mode ์ ์ฉ
1 2 3 4 5 6
// ์ฆ์ ์คํ ํจ์์ ์ ๋์ strict mode ์ ์ฉ (function () { 'use strict'; // Do something... }());
ํจ์ ๋จ์๋ก strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ํผํ์
ํจ์ ๋จ์๋ก strict mode๋ฅผ ์ ์ฉํ์ง ์์ง๋ง, ๊ฐ๊ฐ ์ ์ฉํ๊ณ ์ ์ฉ์ํ๊ณ ํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๊ณ ๋ชจ๋ ํจ์์ ์ผ์ผํ strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์
strict mode๊ฐ ์ ์ฉ๋ ํจ์๋ฅผ ์ฐธ์กฐํ ํจ์ ์ธ๋ถ ์ปจํ ์คํธ์ strict mode๋ฅผ ์ ์ฉํ์ง ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํจ
1 2 3 4 5 6 7 8 9 10 11
(function () { // non-strict mode var lะตt = 10; // ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. function foo() { 'use strict'; let = 20; // SyntaxError: Unexpected strict mode reserved word } foo(); }());
strict mode๋ ์ฆ์ ์คํ ํจ์๋ก ๊ฐ์ผ ์คํฌ๋ฆฝํธ ๋จ์๋ก ์ ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํจ
strict mode๊ฐ ๋ฐ์์ํค๋ ์๋ฌ
์๋ฌต์ ์ ์ญ
์ ์ธํ์ง ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ReferenceError ๋ฐ์
1 2 3 4 5 6
(function () { 'use strict'; x = 1; console.log(x); // ReferenceError: x is not defined }());
๋ณ์, ํจ์, ๋งค๊ฐ๋ณ์์ ์ญ์
delate ์ฐ์ฐ์๋ก ๋ณ์, ํจ์, ๋งค๊ฐ๋ณ์๋ฅผ ์ญ์ ํ๋ฉด SyntaxError ๋ฐ์
1 2 3 4 5 6 7 8 9 10 11 12 13 14
(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 ๋ฐ์
1 2 3 4 5 6 7 8 9
(function () { 'use strict'; //SyntaxError: Duplicate parameter name not allowed in this context function foo(x, x) { return x + x; } console.log(foo(1, 2)); }());
with ๋ฌธ์ ์ฌ์ฉ
with๋ฌธ์ ์ฌ์ฉํ๋ฉด SyntaxError ๋ฐ์
with ๋ฌธ์ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ์ค์ฝํ ์ฒด์ธ์ ์ถ๊ฐํจ
๋์ผํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ ๋ ๊ฐ์ฒด ์ด๋ฆ์ ์๋ตํ ์ ์์ด ์ฝ๋๊ฐ ๊ฐ๋จํด์ง๋ ํจ๊ณผ๊ฐ ์์
- ์ฑ๋ฅ๊ณผ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง๋ ๋จ์ ์ด ์์ด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ถ์ฅํจ
1 2 3 4 5 6 7 8
(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๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ
์๋ฌ๋ ๋ฐ์ํ์ง ์์
1 2 3 4 5 6 7 8 9 10 11 12 13
(function () { 'use strict'; function foo() { console.log(this); // undefined } foo(); function Foo() { console.log(this); // Foo } new Foo(); }());
arguments ๊ฐ์ฒด
strict mode์์๋ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ฌํ ๋นํ์ฌ ๋ณ๊ฒฝํด๋ arguments ๊ฐ์ฒด์ ๋ฐ์๋์ง ์์
1 2 3 4 5 6 7 8
(function (a) { 'use strict'; // ๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ฌํ ๋นํ์ฌ ๋ณ๊ฒฝ a = 2; // ๋ณ๊ฒฝ๋ ์ธ์๊ฐ arguments ๊ฐ์ฒด์ ๋ฐ์๋์ง ์๋๋ค. console.log(arguments); // { 0: 1, length: 1 } }(1));
โ๏ธ ์ฝ์ ์๊ฐ
strict mode๋ ์๊ฒฉ ๋ชจ๋๋ก ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ธฐ ์ด๋ ค์ด ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํด ๋ฑ์ฅํ์๋ค. ์์ฆ์ strict ๋์ TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ๋์ฒดํ๋ ๊ฒ ๊ฐ์๋ค. ์ธ๋ถ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ non-strict mode๋ฅผ ์ ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ๋๋ฌธ์ ์ฆ์์คํ ํจ์๋ก ๋ฌถ์ด ์ฌ์ฉ์ ํด์ผํ๋ค. ๋ํ ESLint๋ฅผ ์ฌ์ฉํด์ ๋์ฒดํ์ฌ๋ ๋ ๊ฒ ๊ฐ์๋ค.
โ ๊ถ๊ธํ ๋ด์ฉ์ด๋ ์ ์ดํด๋์ง ์๋ ๋ด์ฉ
- ์ธ๋ถ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ 3์๋ฅผ ๋ปํ๋ ๋จ์ด
- ์์1) ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฐ๊ณผ ๊ฐ๋ฐ์ ์ฌ์ด์์๋ ํ๋ฌ๊ทธ์ธ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ ๋ฑ
- ์์2) ์๋น์ค์ ์ฌ์ฉ์ ์ฌ์ด์์๋ ์น์๋น์ค, ์์ฉํ๋ก๊ทธ๋จ, ์ดํ๋ฆฌ์ผ์ด์ ๋ฑ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ 3์๋ฅผ ๋ปํ๋ ๋จ์ด