๐ก ์ ๋ง ํด์๋ ์๋๋ ์ผ์ ์ ์ง๋ ๋ค. node.js 6๊ฐ์์ฐจ๊ฐ ๋๊ฐ๋ ์ง๊ธ, ๋ด๊ฐ ์ง์ง ์์ api์ ์๋จ์ 'use strict' ๋ฅผ ๋ณด๊ณ ํ๋ฆฐ๋ ํด๋ฒ๋ ธ๋ค. ์์ธ์ง ์ฃผ์์ฒ๋ผ ๋๊ปด์ง๋ ๊ทธ๊ฒ์ ์ฝ๋๋ผ๋ ๋๋๋ ์๋๊ปด์ก๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๋ฌธ์ ๋ค์์ง. ์ ์๋ฏผ์จ๊ฐ ๋ง๋๋ ์ ๊ท api ๋ 'use strict'๋ฅผ ์์ฐ๋ ๊ฑฐ์ฃ ? ๋ : ์........ ์ฃ์กํฉ๋๋ค..................... ์๊ฐ์ ๋ชปํ์ต๋๋ค..
๐ข MDN Web Docs๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์์ต๋๋ค.
Strict mode
๐ก Strict mode (์๊ฒฉ ๋ชจ๋) ←→ default Sloppy mode (๋์จํ ๋ชจ๋)
- ๊ธฐ์กด์๋ ์กฐ์ฉํ ๋ฌด์๋๋ ์๋ฌ๋ค์ throwing
- JavaScript ์์ง์ ์ต์ ํ ์์
์ ์ด๋ ต๊ฒ ๋ง๋๋ ์ค์๋ฅผ ๋ฐ๋ก์ก์
- ๋์จํ ๋ชจ๋์ ๋์ผํ ์ฝ๋๋ณด๋ค ๋ ๋นจ๋ฆฌ ์์ฉ๋๊ธฐ๋ ํจ
Strict mode ์ ์ฉํ๊ธฐ
์ ์ฒด ์คํฌ๋ฆฝํธ์ ์ ์ฉ
// ์ ์ฒด ์คํฌ๋ฆฝํธ ์๊ฒฉ ๋ชจ๋ ๊ตฌ๋ฌธ
'use strict';
var v = "Hi! I'm a strict mode script!";
- Strict mode์ Sloppy mode์ ์คํฌ๋ฆฝํธ ์ฐ๊ฒฐ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์๊ณ ํด์ผ ํ๋ค.
- ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ํจ์๋ฅผ ๊ธฐ์ค์ผ๋ก Strict mode๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํจ์์ ์ ์ฉ
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."; }
- ํจ์ ๋ณธ๋ฌธ ์ฒ์์ ๋ฃ๋๋ค.
๋ชจ๋์ ์ ์ฉ
function strict() {
// ๋ชจ๋์ด๊ธฐ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฒฉํฉ๋๋ค
}
export default strict;
- ๋ชจ๋์ ์๋์ผ๋ก Strict mode์ด๋ค.
์ค์๋ฅผ ์๋ฌ๋ก ๋ฐ๊พธ๋ ๊ฒ
์ค์๋ก ๊ธ๋ก๋ฒ ๋ณ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ํจ
"use strict";
aaa2 = 1; // ์ ์ญ ๋ณ์ aaa1์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์
- ์ผ๋ฐ์ ์ธ JavaScript์์ ๋ณ์๋ฅผ ์๋ชป ์ ๋ ฅํ๋ฉด ์ ์ญ ๊ฐ์ฒด์ ๋ํ ์ ์์ฑ์ด ๋ง๋ค์ด์ง๊ณ ๊ทธ๋๋ก ๋์ํ๋, Strict mode์์๋ ์ค๋ฅ๋ฅผ ๋ฐ์
์์ธ๋ฅผ ๋ฐ์
"use strict";
// ์ธ ์ ์๋ ํ๋กํผํฐ์ ํ ๋น
var undefined = 5; // TypeError ๋ฐ์
var Infinity = 5; // TypeError ๋ฐ์
// ์ธ ์ ์๋ ํ๋กํผํฐ์ ํ ๋น
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // TypeError ๋ฐ์
// getter-only ํ๋กํผํฐ์ ํ ๋น
var obj2 = { get x() { return 17; } };
obj2.x = 5; // TypeError ๋ฐ์
// ํ์ฅ ๋ถ๊ฐ ๊ฐ์ฒด์ ์ ํ๋กํผํฐ ํ ๋น
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // TypeError ๋ฐ์
- ์ผ๋ฐ ์ฝ๋์์ ์กฐ์ฉํ ๋์ด๊ฐ๋ ๋ชจ๋ ์คํจ์ ๋ํด ์์ธ๋ฅผ ๋ฐ์์ํด
์ญ์ ํ ์ ์๋ ํ๋กํผํฐ๋ฅผ ์ญ์ ํ๋ ค ํ ๋ ์์ธ ๋ฐ์
"use strict";
delete Object.prototype; // TypeError ๋ฐ์
์ ๋ํฌํ ํจ์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ ์๊ตฌ
function sum(a, a, c){ // !!! ๊ตฌ๋ฌธ ์๋ฌ
"use strict";
return a + b + c; // ์ฝ๋๊ฐ ์คํ๋๋ฉด ์๋ชป๋ ๊ฒ์
}
8์ง ๊ตฌ๋ฌธ ๊ธ์ง
- ์ ๋์ฌ 0o๋ฅผ ๋ถ์ฌ 8์ง์ ์ง์
- 0 ์ ๋ถ์ธ 8์ง์๋ Strict mode์์ ์๋ฌ
primitive ๊ฐ์ ํ๋กํผํฐ ์ค์ ๊ธ์ง
"use strict";
false.true = ""; // TypeError
(14).sailing = "home"; // TypeError
"with".you = "far away"; // TypeError
๋ณ์ ์ฌ์ฉ ๋จ์ํ
with ์ฌ์ฉ ๊ธ์ง
- ๋ฐํ์ ์ค์ ๋ธ๋ก ์์ ๋ชจ๋ ์ด๋ฆ์ด ์ ๋ฌ๋ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์ธ๊ทผ ๋๋ ์ ์ญ ์ค์ฝํ ๋ด์ ๋ณ์๋ก ๋งคํ๋ ์๋ ์์
์๊ฒฉ๋ชจ๋์ eval์ ์๋ก์ด ๋ณ์๋ฅผ ์ฃผ์ ์ค์ฝํ์ ์ถ๊ฐํ์ง ์์
function strict1(str){
"use strict";
return eval(str); // str ์ ์๊ฒฉ๋ชจ๋ ์ฝ๋๋ก ๋ค๋ค์ง
}
function strict2(f, str){
"use strict";
return f(str); // eval(...) ์ด ์๋:
// str ์ ์๊ฒฉ๋ชจ๋๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ์๋ง ์๊ฒฉํจ
}
function nonstrict(str){
return eval(str); // str ์ ์๊ฒฉ๋ชจ๋๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ์๋ง ์๊ฒฉํจ
}
strict1("'์๊ฒฉ๋ชจ๋ ์ฝ๋!'");
strict1("'use strict'; '์๊ฒฉ๋ชจ๋ ์ฝ๋!'");
strict2(eval, "'๋์จํ ์ฝ๋.'");
strict2(eval, "'use strict'; '์๊ฒฉ๋ชจ๋ ์ฝ๋!'");
nonstrict("'๋์จํ ์ฝ๋.'");
nonstrict("'use strict'; '์๊ฒฉ๋ชจ๋ ์ฝ๋!'");
์ผ๋ฐ ์ด๋ฆ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ธ์ง
"use strict";
var x;
delete x; // !!! ๊ตฌ๋ฌธ ์๋ฌ
eval("var y; delete y;"); // !!! syntax error
eval๊ณผ arguments๋ฅผ ๋ ๊ฐ๋จํ๊ฒ
๋ณ์๋ช eval๊ณผ arguments๋ ์ธ์ด ๋ฌธ๋ฒ์ ๋ฐ์ด๋๋๊ฑฐ๋ ํ ๋น ๋ ์ ์์
"use strict";
// ALL error
eval = 17;
arguments++;
++eval;
var obj = { set p(arguments) { } };
var eval;
try { } catch (arguments) { }
function x(eval) { }
function arguments() { }
var y = function eval() { };
var f = new Function("arguments", "'use strict'; return 17;");
arguments ๊ฐ์ฒด๊ฐ ์์ฑํ ํ๋กํผํฐ์ ๋ณ์นญ์ ์ง์ ํ์ง ์์
function f(a){
"use strict";
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);
arguments.callee๋ ๋ ์ด์ ์ง์๋์ง ์์
JavaScript ๋ณด์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฐ์ฑ์ผ๋ก ์ธํด ๋ง์ ๋ฐํ์ ์ฒดํฌ๊ฐ ํ์ํจ
- Strict mode๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๋ฐฉ์์ผ๋ก ํธ์ถ๋๋ฏ๋ก ๋ฐํ์ ๊ฒ์ฌ์ ํ์์ฑ์ด ํฌ๊ฒ ์ค์ด๋ค๊ฒ ๋จ
this๋ก ํจ์์ ์ ๋ฌ๋ ๊ฐ์ ๊ฐ์ ๋ก ๊ฐ์ฒด๊ฐ ๋์ง ์์
"use strict";
function fun() { return this; }
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);
- ์ ์ ๋์ง ์์ this๋ undefined๊ฐ ๋จ
- window ๊ฐ์ฒด๋ฅผ this๋ฅผ ํตํด ์ฐธ์กฐํ ์ ์์
ํ์ฅ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ๊ฑท๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ
function restricted()
{
"use strict";
restricted.caller; // throws a TypeError
restricted.arguments; // throws a TypeError
}
function privilegedInvoker()
{
return restricted();
}
privilegedInvoker();
์ธ์๋ ํด๋น ํจ์์ ํธ์ถ ๋ณ์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ์ง ์์
"use strict";
function fun(a, b)
{
"use strict";
var v = 12;
return arguments.caller; //TypeError ๊ฐ ๋ฐ์.
}
fun(1, 2); // doesn't expose v (or a or b)
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
async, await, Promise ๊ทธ๋ฆฌ๊ณ ๋๊ธฐ์ ๋น๋๊ธฐ (2) | 2023.01.04 |
---|---|
node ๋ฒ์ ์ ๋ฐ์ดํธ ํ๊ธฐ (0) | 2023.01.04 |
Serverless ๊ฐ๋ฐ ํ๊ฒฝ ์ ํ ํ๊ธฐ + iterm command not found error (0) | 2023.01.04 |
[Git] ๋ด๊ฐ ๋ณด๋ ค๊ณ ์ ๋ฆฌํ๋ git ๋ช ๋ น์ด (0) | 2021.03.15 |
[AWS] CodeCommit ํฐ๋ฏธ๋ ์ฌ์ฉํ์ฌ git clone ํ๊ธฐ (0) | 2021.03.02 |