# 엄격λͺ¨λ“œ πŸ”—

TODO use strictλŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”κ±ΈκΉŒ ?

ES5에 좔가됨

μ½κΈ°μ „μ—πŸ”— ES5 이전이라 함은, let, const도 μ—†λŠ” var의 μ‹œλŒ€ λ³€μˆ˜λ„ 객체의 ν”„λ‘œνΌν‹°μΌ μ‹œμ ˆ!

μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ¬΅μΈν–ˆλ˜ μ—λŸ¬λ“€μ˜ μ—λŸ¬ λ©”μ‹œμ§€ λ°œμƒ

  • λͺ¨λ“  문법과 λŸ°νƒ€μž„ λ™μž‘ 검사
    • μ‹€μˆ˜λ₯Ό μ—λŸ¬λ‘œ λ³€ν™˜
  • λ³€μˆ˜ μ‚¬μš© λ‹¨μˆœν™”

strict λͺ¨λ“œ μ„ μ–Έ

  • 슀크립트 ν˜Ήμ€ ν•¨μˆ˜μ˜ μ‹œμž‘λΆ€λΆ„μ— 'use strict' μ„ μ–Έ

# 객체

# μ„ μ–Έν•˜μ§€ μ•Šκ³  μ „μ—­ λ³€μˆ˜λ₯Ό λ§Œλ“€ 수 μ—†λ‹€.

Reference Error

testvar = 5;
1

# 읽기 μ „μš©κ°μ²΄(writable: false)에 μ“°λŠ” 것이 λΆˆκ°€λŠ₯

TypeError

var textObj = Object.defineProperties({}, {
    prop1: {
        value: 10,
        writable: false
    }
})
textObj.prop1 = 20;
1
2
3
4
5
6
7

# get으둜 μ„ μ–Έλœ 객체 μˆ˜μ • λΆˆκ°€λŠ₯

TypeError

var obj2 = { get x() { return 17; } };
obj2.x = 5;
1
2

# extensible: false 객체 ν™•μž₯ λΆˆκ°€λŠ₯

TypeError

var testObj = new Object();
Object.preventExtensions(testObj);
testObj.name = 'Bob';
1
2
3

# delete λ³€μˆ˜, ν•¨μˆ˜, 인수 μ‚­μ œ

SyntaxError

var testvar = 15;
function testFunc() {}
delete testvar;
delete testFunc;

Object.defineProperty(testObj, "testvar", {
 value: 10,
 configurable: false
});
delete testObj.testvar;
1
2
3
4
5
6
7
8
9
10

# λ¦¬ν„°λŸ΄ κ°μ²΄λŠ” λ™μΌν•œ μ΄λ¦„μ˜ property λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.

ES6 λŠ” κ°€λŠ₯

SyntaxError

var o = { p: 1, p: 2 };
1

# ν•¨μˆ˜μ˜ λ™μΌν•œ 맀개 λ³€μˆ˜ 이름 μ„ μ–Έ λΆˆκ°€λŠ₯

SyntaxError

function testFunc(param, param) {}
1

# 8μ§„μˆ˜ 숫자 λ¦¬ν„°λŸ΄, μ΄μŠ€μΌ€μ΄ν”„ 문자 μ‚¬μš© λΆˆκ°€λŠ₯

SynTaxError

var testoctal = 010;
var testescape = \010;
1
2

# primitive values 속성 λΆˆκ°€λŠ₯

TypeError

false.true = "";
(14).sailing = "home";
"with".you = "far away";
1
2
3

# λ³€μˆ˜ μ‚¬μš©μ˜ λͺ…λ£Œν™”

strict λͺ¨λ“œλŠ” λ³€μˆ˜ μ΄λ¦„μ˜ Mapping 을 λ‹¨μˆœν™” ν•œλ‹€.

λŒ€λΆ€λΆ„μ˜ 컴파일러의 μ΅œμ ν™”λŠ” λ³€μˆ˜μ˜ Mapping 에 λ‹¬λ €μžˆλ‹€.

# with μ‚¬μš© λΆˆκ°€

πŸ”—

Syntax Error

var foo = { name: "foo" }; 
with (foo) { console.log(name); }
1
2

with 블둝 μ•ˆμ˜ name 은 μ „μ—­λ³€μˆ˜μ˜ name 인지 foo 의 name 인지 λͺ¨ν˜Έν•˜λ‹€.

# eval λŠ” μ£Όλ³€ μŠ€μ½”ν”„μ— μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠμŒ

πŸ”—

var x = 17;
var evalX = eval("'use strict'; var x = 42; x")
console.log(x) // 17
console.log(evalX) // 42
1
2
3
4

# eval/arguments λ₯Ό λ³€μˆ˜, ν•¨μˆ˜, λ§€κ°œλ³€μˆ˜μ˜ μ΄λ¦„μœΌλ‘œ μ‚¬μš© λΆˆκ°€λŠ₯

SyntaxError

eval = 17;
++eval;
var eval;
function x(eval) {}
var y = function eval() {}
1
2
3
4
5

# μΈμžκ°’μ„ μˆ˜μ •ν•΄λ„ arguments 의 값이 μˆ˜μ •λ˜μ§€ μ•ŠμŒ

function f (a) {
    'use strict';
    a = 42;
    return [a, arguments[0]];
}
var pair = f (17);
console.log(pair) // [42, 17]
1
2
3
4
5
6
7

# callee 미지원

TypeError

var f = function() { return arguments.callee };
f();
1
2

# Securing JavaScript

λ³΄μ•ˆμ— κ°•ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μž‘μ„±

μ‚¬μš©μžκ°€ μž‘μ„±ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 접근을 λ§‰μŒ

# this 값이 null λ˜λŠ” undefined λ©΄ μ „μ—­ 객체둜 λ³€ν™˜ν•˜μ§€ μ•ŠμŒ

function fun() { return this; }

console.log(fun()); // undefined
console.log(fun.call(2)); // 2
console.log(fun.apply(null)); // null
console.log(fun.call(undefined)); // undefined
console.log(fun.bind(true)());  // true
1
2
3
4
5
6
7

this 의 κ²°κ³Όκ°€ undefined 의 경우 window 객체둜 λ³€ν™˜ν•˜μ§€ μ•Šκ³ , undefined κ°€ κ·ΈλŒ€λ‘œ 보이게 λ©λ‹ˆλ‹€.

# callee, caller 둜 stack 검색 λΆˆκ°€λŠ₯

function restricted () {
    'use strict';
    restricted.caller;  // TypeError
    restricted.arguments; // TypeError
}
function privilegedInvoker() {
    return restricted();
}
privilegedInvoker();
1
2
3
4
5
6
7
8
9

# arguments caller 미지원

function fun(a, b) {
    'use strict';
    var v = 12;
    return arguments.caller; // TypeError
}
fun (1, 2) // doesn't expose v (or a or b)
1
2
3
4
5
6

# 미래의 μžλ°”μŠ€ν¬λ¦½νŠΈ μ€€λΉ„

# μ˜ˆμ•½μ–΄λ‘œ λ³€μˆ˜/ν•¨μˆ˜ 생성 λΆˆκ°€λŠ₯

implements, interface, package, private, protected, public, static, yield

# ν•¨μˆ˜ 선언은 μŠ€ν¬λ¦½νŠΈλ‚˜ ν•¨μˆ˜μ˜ μ΅œμƒμœ„μ—μ„œ ν•œλ‹€.

μ΅œμƒμœ„μ—μ„œ μ„ μ–Έν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λŠ” λ‹€λ₯Έ 의미λ₯Ό 쀄 수 있음 (?)TODO

if (true) {
    function f() {} // syntax error
    f();
}
for (var i = 0; i < 5; i++){ 
    function f2() { } // !!! syntax error f2(); 
} 
function baz(){  
    function eit() { } 
}
1
2
3
4
5
6
7
8
9
10