function foo() {
x = 10;
}
foo ();
console.log(x); // 10
위의 예시에서 foo
함수 내에서 선언하지 않은 x
변수에 값 10을 할당했다.
자바스크립트 엔진은 x
변수가 어디에서 선언되었는지 스코프 체인을 통해 검색한다.
우선, foo
함수의 스코프에서 x
변수의 선언을,
그 다음으로, foo
함수 컨텍스트의 상위 스코프( 위 예시에서는 전역 스코프 )에서 x
변수의 선언을 검색한다.
어디에도 x
변수의 선언이 존재하지 않기 때문에 ReferenceError가 발생할 것 같지만
자바스크립트 엔진은 암묵적으로 전역 객체에 x
프로퍼티를 동적 생성한다.
이 전역 객체의 x
프로퍼티는 마치 전역 변수처럼 사용할 수 있다.
이러한 현상을 암묵적 전역 implicit global이라 한다.
개발자의 의도와 상관없이 발생한 암묵적 전역은 오류의 원인이 될 가능성이 크다.
반드시 var, let, const 키워드를 사용하여 변수를 선언한 다음 사용하자.
ES5부터 strict mode가 추가되었다.
이는 잠재적인 오류를 발생시킬 수 있는 코드들에 명시적인 에러를 발생시킨다.
전역의 선두 또는 함수 몸체의 선두에 'use strict';
를 추가한다.
전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.
코드의 선두에 제대로 위치 시키지 않으면 제대로 동작하지 않는다.
script mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.
앞서 본 예시와 같다.
strict mode에서는 delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생한다.
중복된 매개변수 이름을 사용하면 SyntaxError가 발생한다.
with 문을 사용하면 SyntaxError가 발생한다.
with 문은 사용해본적이 없다. 언제, 어떻게 사용되는지 찾아보자.
with 문은 객체 속성에 접근할 때 해당 객체를 반복해서 참조할 필요없이 코드를 간결하게 만들어준다.
코드를 간결하게 만둘어주긴 하지만, 가독성 저하, 성능 저하, 스코프 오류 등의 이유로 사용하지 않고, 대부분의 경우에는 with 문 대신 객체를 명시적으로 참조하여 코드를 작성하는 것이 더 안전하고 가독성이 높다고 한다.
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;
console.log(a); // 2
console.log(arguments); // { 0: 1, length: 1 }
}(1));