# μ격λͺ¨λ π
TODO use strictλ μ΄λ»κ² λμνλκ±ΈκΉ ?
ES5μ μΆκ°λ¨
μ½κΈ°μ μπ ES5 μ΄μ μ΄λΌ ν¨μ, let, constλ μλ varμ μλ λ³μλ κ°μ²΄μ νλ‘νΌν°μΌ μμ !
μλ°μ€ν¬λ¦½νΈκ° 묡μΈνλ μλ¬λ€μ μλ¬ λ©μμ§ λ°μ
- λͺ¨λ λ¬Έλ²κ³Ό λ°νμ λμ κ²μ¬
- μ€μλ₯Ό μλ¬λ‘ λ³ν
- λ³μ μ¬μ© λ¨μν
strict λͺ¨λ μ μΈ
- μ€ν¬λ¦½νΈ νΉμ ν¨μμ μμλΆλΆμ
'use strict'
μ μΈ
# κ°μ²΄
# μ μΈνμ§ μκ³ μ μ λ³μλ₯Ό λ§λ€ μ μλ€.
Reference Error
testvar = 5;
# μ½κΈ° μ μ©κ°μ²΄(writable: false)μ μ°λ κ²μ΄ λΆκ°λ₯
TypeError
var textObj = Object.defineProperties({}, {
prop1: {
value: 10,
writable: false
}
})
textObj.prop1 = 20;
2
3
4
5
6
7
# getμΌλ‘ μ μΈλ κ°μ²΄ μμ λΆκ°λ₯
TypeError
var obj2 = { get x() { return 17; } };
obj2.x = 5;
2
# extensible: false κ°μ²΄ νμ₯ λΆκ°λ₯
TypeError
var testObj = new Object();
Object.preventExtensions(testObj);
testObj.name = 'Bob';
2
3
# delete λ³μ, ν¨μ, μΈμ μμ
SyntaxError
var testvar = 15;
function testFunc() {}
delete testvar;
delete testFunc;
Object.defineProperty(testObj, "testvar", {
value: 10,
configurable: false
});
delete testObj.testvar;
2
3
4
5
6
7
8
9
10
# 리ν°λ΄ κ°μ²΄λ λμΌν μ΄λ¦μ property λ₯Ό κ°μ§ μ μλ€.
ES6 λ κ°λ₯
SyntaxError
var o = { p: 1, p: 2 };
# ν¨μμ λμΌν λ§€κ° λ³μ μ΄λ¦ μ μΈ λΆκ°λ₯
SyntaxError
function testFunc(param, param) {}
# 8μ§μ μ«μ 리ν°λ΄, μ΄μ€μΌμ΄ν λ¬Έμ μ¬μ© λΆκ°λ₯
SynTaxError
var testoctal = 010;
var testescape = \010;
2
# primitive values μμ± λΆκ°λ₯
TypeError
false.true = "";
(14).sailing = "home";
"with".you = "far away";
2
3
# λ³μ μ¬μ©μ λͺ λ£ν
strict λͺ¨λλ λ³μ μ΄λ¦μ Mapping μ λ¨μν νλ€.
λλΆλΆμ μ»΄νμΌλ¬μ μ΅μ νλ λ³μμ Mapping μ λ¬λ €μλ€.
# with μ¬μ© λΆκ°
Syntax Error
var foo = { name: "foo" };
with (foo) { console.log(name); }
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
2
3
4
# eval/arguments λ₯Ό λ³μ, ν¨μ, 맀κ°λ³μμ μ΄λ¦μΌλ‘ μ¬μ© λΆκ°λ₯
SyntaxError
eval = 17;
++eval;
var eval;
function x(eval) {}
var y = function eval() {}
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]
2
3
4
5
6
7
# callee λ―Έμ§μ
TypeError
var f = function() { return arguments.callee };
f();
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
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();
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)
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() { }
}
2
3
4
5
6
7
8
9
10