function foo() { x = 10; } foo(); console.log(x) // ?
์ ์ญ ์ค์ฝํ์๋ x ๋ณ์์ ์ ์ธ์ด ์กด์ฌํ๊ธฐ ์๊ธฐ ๋๋ฌธ์ ReferenceError๋ฅผ ๋ฐ์์ํฌ ๊ฒ ๊ฐ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ฌต์ ์ผ๋ก ์ ์ญ ๊ฐ์ฒด์ x ํ๋กํผํฐ๋ฅผ ๋์ ์์ฑํ๋ค. ์ด๋ ์ ์ญ ๊ฐ์ฒด์ x ํ๋กํผํฐ๋ ๋ง์น ์ ์ญ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ ํ์์ ์๋ฌต์ ์ ์ญ์ด๋ผ ํจ. ์๋ฌต์ ์ ์ญ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
strict mode๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด์ ๋ฌธ๋ฒ์ ์ข ๋ ์๊ฒฉํ ์ ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ๋๊ฑฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ต์ ํ ์์ ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ฝ๋์ ๋ํด ๋ช ์์ ์ธ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
ESLint ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด๋ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ง๋ง ๋์ฑ ๊ฐ๋ ฅํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ESLint๋ฅผ ์ฌ์ฉํ์.
strict mode๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ ์ญ์ ์ ๋ ๋๋ ํจ์ ๋ชธ์ฒด์ ์ ๋์ 'use strict';๋ฅผ ์ถ๊ฐํ๋ค.
์ ์ญ์ ์ ๋์ ์ถ๊ฐํ๋ฉด ์คํฌ๋ฆฝํธ ์ ์ฒด์ strict mode๊ฐ ์ ์ฉ๋๋ค.
'user strict';
function foo() {
x = 10; // ReferenceError : x is not defined
}
foo();
ํจ์ ๋ชธ์ฒด์ ์ ๋์ ์ถ๊ฐํ๋ฉด ํด๋น ํจ์์ ์ค์ฒฉ ํจ์์ strict mode๊ฐ ์ ์ฉ๋๋ค.
์ฆ์ ์คํ ํจ์๋ก ์คํฌ๋ฆฝํธ ์ ์ฒด๋ฅผ ๊ฐ์ธ์ ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ๊ณ ์ฆ์ ์คํ ํจ์์ ์ ๋์ strict mode๋ฅผ ์ ์ฉํ์.
// ์ฆ์ ์คํ ํจ์์ ์ ๋์ strict mode ์ ์ฉ
(function () {
'use strict';
// Do something...
}());
์ด๋ค ํจ์๋ strict mode๋ฅผ ์ ์ฉํ๊ณ ์ด๋ค ํจ์๋ strict mode๋ฅผ ์ ์ฉํ์ง ์๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ํจ์์ ์ผ์ผ์ด strict๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ค.
๋ฐ๋ผ์ 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 ๋ฌธ์ ์ฌ์ฉํ๋ฉด SyntaxError๊ฐ ๋ฐ์ํ๋ค ์ฌ์ฉํ์ง ๋ง์
(function () {
'use strict';
// SyntaxError: Strict mode code may not include a with statement
with({ x: 1}) {
console.log(x);
}
}());
strict mode์์ ํจ์๋ฅผ ์ผ๋ฐ ํจ์๋ก์ ํธ์ถํ๋ฉด this์ undefined๊ฐ ๋ฐ์ธ๋ฉ๋๋ค. ์์ฑ์ ํจ์๊ฐ ์๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์์๋ this๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์๋ฌ๋ ๋ฐ์ํ์ง ์๋๋ค.
(function () {
'use-strict' ;
function foo() {
console.log(this); // undefined
}
foo();
function Foo(){
console.log(this); // Foo
}
new Foo();
}());
strict mode์์๋ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ฌํ ๋นํ์ฌ ๋ณ๊ฒฝํด๋ arguments ๊ฐ์ฒด์ ๋ฐ์๋์ง ์๋๋ค.
(function (a) {
'use strict' ;
// ๋งค๊ฐ๋ณ์์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์ฌํ ๋นํ์ฌ ๋ณ๊ฒฝ
a = 2;
// ๋ณ๊ฒฝ๋ ์ธ์๊ฐ arguments ๊ฐ์ฒด์ ๋ฐ์๋์ง ์๋๋ค;
console.log(arguments); // {0:1, length: 1}
}(1));