javascript strict mode

javascript

목록 보기
14/14
post-thumbnail

1. strict mode란?

function foo() {
	x = 10;
}
foo();

console.log(x); // ?

foo 함수 내에서 선언하지 않은 x 변수에 값 10을 할당했다.
이때 x 변수를 찾아야 x에 값을 할당할 수 있기 때문에 자바스크립트 엔진은 x 변수가 어디에서 선언되었는지 스코프 체인을 통해 검색하기 시작한다.

자바스크립트 엔진은 먼저 foo 함수의 스코프에서 x 변수의 선언을 검색한다.
foo 함수의 스코프에는 x 변수의 선언이 없으므로 검색에 실패할 것이고, 자바스크립트 엔진은 x 변수를 검색하기 위해 foo 함수 컨텍스트의 상위 스코프(위 예제의 경우 전역 스코프)에서 x 변수의 선언을 검색한다.

전역 스코프에도 x 변수의 선언이 존재하지 않기 때문에 ReferenceError를 발생시킬 것 같지만 자바스크립트 엔진은 암묵적으로 전역 객체에 x 프로퍼티를 동적 생성한다.
이때 전역 객체의 x 프로퍼티는 마치 전역변수처럼 사용할 수 있다.

이러한 현상을 암묵적 전역이라 한다.

2. strict mode의 적용
strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 'use strict';를 추가한다.
전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.

'use strict';

function foo() {
	x =10; // ReferenceError : x is not defined
}
foo();

함수 몸체의 선두에 추가하면 해당 함수와 중첩 함수에 strict mode가 적용된다.

function foo() {
	'use strict';
	x =10; // ReferenceError : x is not defined
}
foo();

코드의 선두에 'use strict';를 위치시키지 않으면 strict mode가 제대로 동작하지 않는다.

**3. 전역에 strict mode를 적용하는 것은 피하자.

  1. 함수 단위로 strict mode를 적용하는 것도 피하자.
  1. strict mode가 발생시키는 에러**
  • 암묵적 전역
(function () {
	'use strict';
    
    x = 1;
    console.log(x); // ReferenceError : x is not defined
}());

- 변수, 함수, 매개변수의 삭제
delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생한다.

- 매개변수 이름의 중복
중복된 매개변수 이름을 사용하면 SyntaxError가 발생한다.

- with 문의 사용
with 문을 사용하면 SyntaxError가 발생한다.
with 문은 전달된 객체를 스코프 체인에 추가한다.

**6. strict mode 적용에 의한 변화

  • 일반 함수의 this**
    strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다.
    생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다.

- arguments 객체
strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.

profile
Hi there 👋 💻✨✋🏻💙💜

0개의 댓글