function foo() {
x = 10;
}
foo();
console.log(x);
foo함수 내에서 선언하지 않은 x변수에 10을 할당.
-> x변수를 찾아야 x에 값을 할당할 수 있음
-> 스코프 체인을 통해 x변수를 검색하기 시작
x 변수를 검색하기 위해 foo 함수 컨텍스트의 상위 스코프에서 x 변수의 선언을 검색
암묵적 전역 implicit global 발생!!!!!!
-> 이는 개발자의 의도와 상관없이 오류가 발생할수도 있기에 const, let, var 키워드 사용을 권장함
전역의 선두 / 함수 몸체의 선두에
'use strict' 을 추가!
'use strict'
function foo() {
x = 10;
}
foo();
console.log(x);
//ReferenceError
function foo() {
x = 10;
'use strict'
}
foo();
console.log(x);
//10
(function(){
'use strict'
}());
(function () {
function foo() {
'use strict'
x = 10;
}
foo();
}());
즉시 실행 함수로 감싼 스크립트 단위로 적용하자
(function () {
'use strict'
var a = 1;
delete a;
function foo(a) {
delete a;
}
delete foo;
}());
(function () {
'use strict'
function add(x, x) {
return x + x;
}
console.log(1, 2);
}());
(function () {
'use strict'
with ({ x: 1 }) {
console.log(x);
}
}());
Uncaught SyntaxError: Strict mode code may not include a with statement
with 문은 전달된 객체를 스코프 체인에 추가
동일한 객체의 프로퍼티를 반복해서 사용할 때
객체이름을 생략할 수 있어서 코드가 간단해지는 효과가 있음
-> 성능과 가독성이 나빠짐,,
strict mode에서 일반함수로서 호출하면 this에 undefined가 바인딩
생성자 함수가 아니면 의미가 없음
(function () {
'use strict'
//undefinded
function foo() {
console.log(this);
}
foo();
//Foo
function Foo() {
console.log(this);
}
new Foo();
}());
(function (a) {
'use strict'
a = 2;
console.log(arguments)
}());