다음 예제 실행 결과를 예측해보자
function foo() {
x = 10;
}
foo();
consoloe.log(x); // ?
함수 내부에서 선언하지 않은 x 변수에 값 10을 할당했다.
전역 스코프에서도 x 변수의 선언이 존재하지 않기 때문에 ReferenceError를
발생시킬 것 같지만 자바스크립트는 암묵적으로 전역객체에 x 프로퍼티를 동적 생성한다.
x의 결과는 10이 나오게 된다.
개발자의 의도와는 상관없이 발생한 암묵적 전역은
오류를 발생시키는 원인이 될 가능성이 크다.
따라서 반드시 let, const 키워드를 사용하여 변수를 선언한 다음에 사용해야 한다.
strict mode는 쉽게 말해 자바스크립트 언어의 문법을 좀 더 엄격하게 적용해서
오류를 줄이고 안정적인 생산을 하기 위한 근본적인 해결책이다.
strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에
'use strict'; 를 추가한다.
전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.
함수 몸체의 선두에 추가하면 해당 함수와 중첩 함수에 strict mode가 적용된다.
코드의 선두에 'use strict'; 를 위치시키지 않으면 strict mode가 제대로 동작하지 않는다.
외부 서드파티 라이브러리를 사용하는 경우 라이브 러리가 non-strict mode인 경우도
있기 때문에 전역에서 strict mode를 적용하는것은 바람직하지 않다.
선언하지 않은 변수를 참조하면 ReferenceError가 발생한다.
(function () {
'use strict';
x = 1;
console.log(x); // ReferenceError: x is not difiend
}();
중복된 매개변수 이름을 사용하면 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));
}());