자바스크립트 var 선언 없이 작동하는 변수는 없다
자바스크립트는 너무 유연하게 작동하여 프로그래머가 실수를 한 때 멈추지 않고 엉뚱한 결과를 만들어 낼 수 있다. 기초 이론을 자세하게 공부하지 않은 개발자들에게는 쉽게 입문할 수 있다는 장점이 되고 규모가 작은 작업의 경우에는 특별히 문제될 게 없지만 큰 프로젝트의 경우에는 디버깅이 많이 번거로워진다.
변수를 사용하려면 반드시 선언이 필요하다.
모던 자바스크립트 deep dive, 이웅모
맞다.
전역 변수로 사용하려면 함수 밖에서 선언하거나 함수 안에서는 var 예약어를 빼고 선언해야 합니다.
html+css+자바스크립트 웹 표준의 정석, 고경희
틀리다. 그런데 아래의 코드는 작동한다.
TestVar = 1;
console.log(TestVar); // 1
왜 그럴까?
어떠한 객체의 프라퍼티나 메떠드에 접근할 때 그 객체의 이름을 특정하지 않으면 전역 객체의 멤버로 처리된다. 예를 들면 델파이나 c#에서 this의 경우인데 this.Property는 this를 생략하고 그냥 Property로 써도 된다.
문제는 자바스크립트의 경우 특정 객체에 없는 프라퍼티에 값을 할당하면 이 프라퍼티가 만들어진다는 거다. 이게 바로 지나치게 유연하여 문제가 된다는 부분의 예다. 웹 브라우저의 경우 전역 객체는 Window이므로 위 코드는 Window.TestVar를 동적으로 만든 거다. 이건 변수가 아니므로 위 고경희 책의 내용은 틀린 거고 심지어 선언과 할당도 혼동하고 있다.
Note that the implication of the above, is that, contrary to popular misinformation, JavaScript does not have implicit or undeclared variables, it merely has a syntax that looks like it does.
var, mdn web docs
많은 사람들이 착각하고 있는데 위의 경우 선언되지 않은 변수인 게 아니라 그저 변수처럼 보이는 것일 뿐이라는 설명이다.