function f(){
x = 1;
}
f();
console.log(x); // 1
암묵적 전역
x에 1을 할당하기 위해 x를 찾는데 x가 선언이 되어 있지 않다
전역 스코프까지 올라와서도 x가 없다
암묵적으로 전역 객체에 x를 프로퍼티로 추가
strict mode는 문법을 보다 엄격히 적용하여 명시적 에러를 발생시킴
'use strict'; 를 코드의 선두에 추가하면 적용
전역의 선두에 추가 : 스크립트 전체
함수 선언 내부의 선두 : 함수와 그 안의 중첩함수
<!DOCTYPE html>
<html>
<body>
<script>
'use strict';
</script>
<script>
x = 1; //에러 ㄴ
</script>
<script>
'use strict';
y = 2; //에러
</script>
</body>
</html>
전역에 적용한 strict mode는 해당 스크립트에만 적용됨
non-strict mode인 외부 라이브러리를 불러오는데 전역이 strict-mode면 오류
이럴 경우 즉시 실행 함수로 스크립트를 감싸고 즉시 실행 함수의 선두에 strict moded 적용
(function(){
'use strict';
...
}());
즉시 실행 함수로 감싼 스크립트 단위로만 적용해라
선언하지 않은 변수 참조시 ReferenceError
delete 연산자 사용 시 SyntaxError
중복된 매개변수 이름 사용시 SyntaxError
function plus(x,x){
return x+x;
}
plus(1,2); //4
(function f(){
'use strict';
function plus(x,x){
return x+x;
}
}()); // SyntaxError
일반함수에서 this는 전역객체를 가르키지만
strict mode에서는 undefined이다, 에러는 X
매개변수에 전달된 인수를 재할당해서 변경하면 변경은 되지만 arguments객체는 그대로 변경 X
(function(x){
'use strict';
x = 10;
console.log('x는',x); // x는 10
console.log(arguments); // arguments 는 1000
}(1000));
(function(x){
x = 10;
console.log('x는',x); x는 10
console.log(arguments); arguments도 10
}(1000));