ES5 νμ€κΉμ§ν΄λ μλ°μ€ν¬λ¦½νΈλ λ¬Έμ κ° λ§μμ΅λλ€. κ·Έλ¬λ μ΄ μκΈ°μλ μμ±λ λμ νλ‘κ·Έλλ°μ μν΄ μ¬λ¬ λ°©λ²μ κ°κ΅¬νμ£ . κ·Έ μ€ νλμΈ μ격(strict) λͺ¨λμ λν΄ μμλ΄ λλ€.
μλ°μ€ν¬λ¦½νΈ μΈμ΄μ λ¬Έλ²μ μ’ λ μ격ν μ μ©ν΄ λ¬Έμ λ₯Ό λ΄ν¬νλ μ½λμ λν΄ λͺ μμ μλ¬λ₯Ό λ°μμν΅λλ€.
λ€μ ν λ² μκ°ν΄λ΄ μλ€. μλ°μ€ν¬λ¦½νΈ μΈμ΄μ λ¬Έμ μ μ λκ° μμμκΉμ? λνμ μΌλ‘ κΌ½μλ©΄ var ν€μλ, λ³μ νΈμ΄μ€ν , μ묡μ μ μ(Implict global) λ±μ΄ μμμ£ . μ묡μ μ μμ λν΄ μ½λλ₯Ό μ΄ν΄λ³΄κ³ λΉ λ₯΄κ² λμ΄κ°κ² μ΅λλ€.
- μ묡μ μ μ : μ무리 λ΄λ μλ¬μΈ μλμ μ½λλ λ무λ μ μλλ©λλ€.
function foo() { x = 10; } foo(); console.log(x); // 10
- μ½λμ λ¬Έμ λ₯Ό μ΄ν΄νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λμ μμλ₯Ό μ΄ν΄λ³ΌκΉμ
- foo ν¨μ λ΄μμ μ μΈνμ§ μμ x λ³μμ κ° 10μ ν λΉν©λλ€.
- x λ³μκ° μ΄λμμ μ μΈλμλμ§ μ€μ½ν 체μΈμ ν΅ν΄ κ²μν©λλ€.
- foo μ€μ½νμμ νμνκ³ , μμ μ€μ½νμΈ μ μ μ€μ½νμμ x λ³μμ μ μΈμ νμν©λλ€.
- κ·Έ μ΄λμλ μ‘΄μ¬νμ§ μμ ReferenceErrorλ₯Ό λ°μμμΌμΌνλ μμ§μ λμ μΌλ‘ x νλ‘νΌν°λ₯Ό μμ±ν©λλ€.
- μ μ κ°μ²΄μ x νλ‘νΌν°λ μ μ λ³μμ²λΌ μ¬μ©ν μ μκ² λ©λλ€. μ΄λ¬ν νμμ΄ μ묡μ μ μμ λλ€.
- μ½λμ λ¬Έμ λ₯Ό μ΄ν΄νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λμ μμλ₯Ό μ΄ν΄λ³ΌκΉμ
μ΄ μΈμλ λ§μ λ¬Έμ λ‘ μΈν΄ ES5μμ strict mode(μ격 λͺ¨λ)κ° μΆκ° λμμΌλ©°, ESLint κ°μ λ¦°νΈ λꡬλ‘λ μ΄λ₯Ό κ°λ ₯νκ² κ²μ¬ν μ μμ΅λλ€.
μ μμ μ λ λλ ν¨μ λͺΈμ²΄ μ λμ
'use strict';
λ₯Ό μμ±ν©λλ€.
-
μ μμ μ λμ μμ± μ μ μ μ€μ½νμ μ μ©λ©λλ€.
'use strict'; function foo(){ x = 10; // ReferenceError: x is not defined } foo();
-
ν¨μ λͺΈμ²΄μ μ λμ μμ± μ ν΄λΉ ν¨μ μ€μ½νμμλ§ μ μ©λ©λλ€.
function foo(){ 'use strict'; x = 10; // ReferenceError: x is not defined } foo();
-
μ λκ° μλ κ³³μ μμ± μμ λλ‘ λμνμ§ μμ΅λλ€.
function foo(){ x = 10; 'use strict'; } foo();
μ μμ μ μ©ν strict modeλ μ€ν¬λ¦½νΈ λ¨μλ‘ μ μ©λ©λλ€.
- λ€λ₯Έ μ€ν¬λ¦½νΈμ μν₯μ μ£Όμ§ μκ³ ν΄λΉ μ€ν¬λ¦½νΈμ νμ λ©λλ€.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script type="text/javascript"> 'user strict'; </script> <script type="text/javascript"> x = 1; console.log(x); </script> <script type="text/javascript"> 'user strict'; y = 1; console.log(y); // ReferenceError: y is not defined </script> </body> </html>
- μ€ν¬λ¦½νΈ λ³λ‘ μ μ©νλ κ²μ μ€λ₯λ₯Ό λ°μμν¬ μ μμ΅λλ€. νΉν μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λλμ.
μ΄λ€ ν¨μλ strict mode, μ΄λ€ ν¨μλ non-strict mode? λΉμ°ν λ°λμ§νμ§ μμΌλ©°, κ·Έλ°λ€κ³ λͺ¨λ ν¨μμ μΌμΌμ΄ strict modeλ₯Ό μ μ©νλ κ²λ μ³μ§ μμ΅λλ€.
- strict modeκ° μ μ©λ ν¨μκ° μ°Έμ‘°ν ν¨μ μΈλΆμ 컨ν
μ€νΈμ strict modeλ₯Ό μ μ©νμ§ μμλ€λ©΄ λ¬Έμ κ° λ°μν μ μμ΅λλ€.
(function(){ var x = 10; function foo(){ 'use strict'; x = 20; } foo(); }());
μλ¬κ° λλ€κ³ μ νμλλ° μ μμ μΌλ‘ μλνλ€μ?π λ¬΄μ¨ μΌμ΄μ§...
κ·ΈλΌ strict modeλ‘ μ½λλ₯Ό μ격νκ² κ΄λ¦¬ν΄μ μΌμ΄λλ μΌμ λκ° μμκΉμ?
μ묡μ μ μ, λ³μ/ν¨μ/맀κ°λ³μμ μμ , 맀κ°λ³μ μ΄λ¦ μ€λ³΅, withλ¬Έ μ¬μ© λ±μ΄ λνμ μ λλ€.
μ μΈνμ§ μμ λ³μλ₯Ό μ°Έμ‘°νλ©΄ ReferenceErrorκ° λ°μν©λλ€.
(function(){
'use strict';
x = 10;
console.log(x); // ReferenceError: x is not defined
}());
delete μ°μ°μλ‘ ν΄λΉ νλ‘νΌν°λ₯Ό μμ νλ©΄ SyntaxErrorκ° λ°μν©λλ€.
(function(){
'use strict';
var x = 10;
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.
}());
μ€λ³΅λ μ΄λ¦μ μ¬μ©νλ©΄ SytaxErrorκ° λ°μν©λλ€.
(function(){
'use strict';
function foo(a, a) {
return a + a; // SyntaxError: Duplicate parameter name not allowed in this context
}
console.log(foo(1, 2));
}());
μ λ¬λ κ°μ²΄λ₯Ό μ€μ½ν 체μΈμ μΆκ°νλ withλ¬Έμ μ¬μ©νλ©΄ SyntaxErrorκ° λ°μν©λλ€.
(function(){
'use strict';
with({ x: 1 }){
console.log(x); // SyntaxError: Strict mode code may not include a with statement
}
}());
λ§μ§λ§μ
λλ€! strict modeλ₯Ό μ μ©νλ©΄ λ³νλ λμμ΄ μ‘΄μ¬ν κΉμ? κ·Έ λ΅μ μμ΅λλ€
μ΄κ³ , μ΄μ νμΈν΄ λ³Ό κ±°μμ.
μΌλ° ν¨μμ thisμ arguments κ°μ²΄μ λμμ΄ λ³κ²½λ©λλ€.
μΌλ° ν¨μλ‘ νΈμΆνλ©΄ thisμ undefinedκ° λ°μΈλ©λ©λλ€. μμ±μ ν¨μκ° μλ μΌλ° ν¨μ λ΄λΆμμλ thisλ₯Ό μ¬μ©ν νμκ° μκΈ° λλ¬Έμ΄μ£ .
(function(){
'use strict';
function foo(){
console.log(this); // undefined
}
foo();
function Foo(){
console.log(this); // Foo
}
new Foo();
}());
맀κ°λ³μμ μ λ¬λ μΈμλ₯Ό μ¬ν λΉνμ¬ λ³κ²½ν΄λ λ°μλμ§ μμ΅λλ€.
(function(x){
'use strict';
x = 10;
console.log(arguments); // ArgumentsΒ [callee: (...), Symbol(Symbol.iterator): Ζ]
}());