아래 코드를 실행하면 JS 엔진은 foo
함수의 Scope에서 x
를 찾는다.
그러나 let
, var
등으로 선언된 변수가 아니기 때문에 존재하지 않을 것이고, Global Scope로 올라가 검색하게 될 것이다.
function foo() {
x = 10;
}
foo();
console.log(x);
이렇듯 Keyword 없이 선언된 변수가 Global Scope에 존재하지 않으면 JS 엔진에 의해 암묵적으로 전역 객체에 x
가 동적 생성된다.
이를 Implicit Global, 암묵적 전역이라고 한다.
이는 오류를 발생시키는 원인이 될 가능성이 크기 때문에 반드시 Keyword로 변수를 선언해야 한다.
다른 언어에서는 이러한 오류를 미리 잡아주지만, JS는 이러한 자잘한 실수들을 개발자가 알아서 잘 처리해야 하는 불안정한 면이 있었다.
그래서 ES5부터 strict mode가 도입 되어, 이러한 잘못된 코드를 보고 미리 오류를 발생시킨다.
ESLint, TypeScript 등과 비슷한 것 같다.
ES6에서 도입된 Class와 모듈은 기본적으로 strict mode다.
코드 상단에 'use strict'
한 줄을 추가하면 코드 전체에 적용된다.
'use strict';
function foo() {
x = 10; // ReferenceError: x is not defined
}
foo();
console.log(x);
함수 바디 상단에 'use strict'
한 줄을 추가하면 함수, 중첩 함수에 적용된다.
function foo() {
'use strict';
x = 10; // ReferenceError: x is not defined
}
foo();
console.log(x);
함수 바디 최상단이 아닌 경우 제대로 동작하지 않는다.
function foo() {
x = 10; // 오류 발생 x
'use strict';
}
foo();
console.log(x);