// μ€νκ²°κ³Όλ₯Ό μμΈ‘ν΄λ³΄μΈμ.
function foo() {
x = 10;
}
foo();
console.log(x); // ?
foo ν¨μλ΄μ μ μΈνμ§ μμ x λ³μμ κ° 10μ ν λΉ μ΄ λ x λ³μλ₯Ό μ°ΎμμΌ xμ κ°μ ν λΉν μ μκΈ° λλ¬Έμ μλ°μ€ν¬λ¦½νΈ μμ§μ x λ³μκ° μ΄λμμ μ μΈλμλμ§ μ€μ½ν체μΈμ ν΅ν΄ κ²μνκΈ° μμ. νμ§λ§ foo ν¨μ μ€μ½νμμλ κ·Έ μμ μ€μ½νμμλ x λ³μμ μ μΈμ΄ μμΌλ―λ‘ κ²μμ μ€ν¨
κ·ΈλΌ λΉμ°ν ReferenceErrorλ₯Ό λ°μμν¬ κ² κ°μ§λ§ μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ μΌλ‘ μ μ κ°μ²΄μ xνλ‘νΌν°λ₯Ό λμ μμ±. μ΄ λ μ μ κ°μ²΄μ x νλ‘νΌν°λ λ§μΉ μ μ λ³μμ²λΌ μ¬μ©ν μ μκ³ μ΄λ¬ν νμμμ묡μ μ μ
μ΄λΌ νλ€.
μ΄λ¬νμ묡μ μ μ
νμμ μ€λ₯λ₯Ό λ°μμν€λ μμΈμ΄ λ κ°λ₯μ±μ΄ λ§€μ° ν¬λ€. μ΄λ₯Ό λ§κΈ° μν΄ ES5λΆν°strict mode(μ격 λͺ¨λ)
κ° μΆκ°λμλ€.strict mode
λ μλ°μ€ν¬λ¦½νΈ μΈμ΄μ λ¬Έλ²μ μ’ λ μ격ν μ μ©νμ¬ μ€λ₯λ₯Ό λ°μμν¬ κ°λ₯μ±μ΄ λκ±°λ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΅μ ν μμ μ λ¬Έμ λ₯Ό μΌμΌν¬ μ μλ μ½λμ λν΄ λͺ μμ μΈ μλ¬λ₯Ό λ°μμν¨λ€.
strict modeλ₯Ό μ μ©νλ €λ©΄ μ μμ μ λ λλ ν¨μ λͺΈμ²΄μ μ λμ
'use strict;'
λ₯Ό μΆκ°νλ€.
β μ μμ μ λμ μΆκ°νλ©΄ μ€ν¬λ¦½νΈ μ 체μ strict mode
κ° μ μ©λλ€.
β ν¨μ λͺΈμ²΄μ μ λμ μΆκ°νλ©΄ ν΄λΉ ν¨μμ μ€μ²© ν¨μμ strict mode
κ° μ μ©λλ€.
β μ½λμ μ λμ 'use strict;'
λ₯Ό μμΉμν€μ§ μμΌλ©΄ strict mode
κ° μ λλ‘ λμνμ§ μλλ€.
function foo() {
x = 10;
'use strict';
}
foo();
μ μμ μ μ©ν
strict mode
λ μ€ν¬λ¦½νΈ λ¨μλ‘ μ μ©λλ€.
<!DOCTYPE html>
<html>
<body>
<script>
'use strict';
</script>
<script>
x = 1; // μλ¬κ° λ°μνμ§ μλλ€.
console.log(x); // 1
</script>
<script>
'use strict';
y = 1; // ReferenceError: y is not defined
console.log(y);
</script>
</body>
</html>
μ€ν¬λ¦½νΈ λ¨μλ‘ μ μ©λ
strict mode
λ λ€λ₯Έ μ€ν¬λ¦½νΈμ μν₯μ μ£Όμ§ μκ³ ν΄λΉ μ€ν¬λ¦½νΈμ νμ λμ΄ μ μ©.
strict mode
μnon-strict mode
λ₯Ό νΌμ©ν΄μ μ¬μ©νλ©΄ μ€λ₯λ₯Ό λ°μμν¬ μ μλ€. νΉν μΈλΆ μλνν° λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²½μ° λΌμ΄λΈλ¬λ¦¬κ°non-strict mode
μΈ κ²½μ°λ μκΈ° λλ¬Έμ μ μμstrict mode
λ₯Ό μ μ©νλ κ²μ λ°λμ§νμ§ μλ€.
μ΄λ¬ν κ²½μ° μ¦μ μ€ν ν¨μλ‘ μ€ν¬λ¦½νΈ μ 체λ₯Ό κ°μΈμ μ€μ½νλ₯Ό ꡬλΆνκ³ μ¦μ μ€ν ν¨μμ μ λμstrict mode
λ₯Ό μ μ©.
ν¨μλ¨μλ‘ μΌμΌμ΄
strict mode
λ₯Ό μ μ©νλ κ²μ λ²κ±°λ‘μ΄ μΌμ΄λ€.
κ·Έλ¦¬κ³ strict modeκ° μ μ©λ ν¨μκ° μ°Έμ‘°ν ν¨μ μΈλΆμ 컨ν μ€νΈμ strict modeλ₯Ό μ μ©νμ§ μλλ€λ©΄ λ¬Έμ κ° λ°μν μ μλ€.
(function () {
// non-strict mode
var lΠ΅t = 10; // μλ¬κ° λ°μνμ§ μλλ€.
function foo() {
'use strict';
let = 20; // SyntaxError: Unexpected strict mode reserved word
}
foo();
}());
λ°λΌμ
strict mode
λ μ¦μ μ€ν ν¨μλ‘ κ°μΌ μ€ν¬λ¦½νΈ λ¨μλ‘ μ μ©νλ κ²μ΄ λ°λμ§.
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: Duplicate parameter name not allowed in this context
function foo(x, x) {
return x + x;
}
console.log(foo(1, 2));
}());
with문
μ μ¬μ©νλ©΄SyntaxError
κ° λ°μ.
with문
μ μ λ¬λ κ°μ²΄λ₯Ό μ€μ½ν 체μΈμ μΆκ°νλ€.withλ¬Έ
μ λμΌν κ°μ²΄μ νλ‘νΌν°λ₯Ό λ°λ³΅ν΄μ μ¬μ©ν λ κ°μ²΄ μ΄λ¦μ μλ΅ν μ μμ΄μ μ½λκ° κ°λ¨ν΄μ§λ ν¨κ³Όκ° μμ§λ§ μ±λ₯κ³Ό κ°λ μ±μ΄ λλΉ μ Έ μ¬μ©νμ§ μλκ²μ΄ μ’λ€.
(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));