느슨한 모드에서는 전역 스코프에 undefined에 값을 할당할 수 있다.(절대 비추천)
function foo() {
undefined = 2; // 타입 에러가 발생하지 않는다.
}
foo(); // undefined
function foo() {
"use strict";
undefined = 2; // 타입 에러 발생
}
foo(); // TypeError: Cannot assign ...
그런데 황당한 것은 undefined라는 지역변수를 생성할 수 있다.
function foo() {
"use strict"
var undefined = 2;
console.log(undefined);
}
foo(); // 2
절대 이렇게 쓰지 말자.
보이드 연산자는 어떤 값이든 무효로 만드는 특징이 있어서 값을 undefined로 만들어 버린다.
기존 값은 건드리지 않기 때문에 !(부정 연산자)를 쓰고 싶지 않을 때 즉, 긍정 오류가 일어나지 않게 하고 싶을 때 사용하면 요긴하다.
var a = 42;
console.log( void a , a ); // undefined 42
function doSomething() {
// APP은 이 애플리케이션에서 제공한 값이다..?
if (!APP.ready) {
return void setTimeout(doSomething, 100)
}
var result;
return result;
}
if (doSomething()) {
// 다음 작업 바로 실행
}
// 혹은
if (!APP.ready) {
// 나중에 다시 해보자!
setTimeout( doSomething, 100 );
return;
}
링크에 href값에 javascript(void:0); 를 넣는 것을 종종 보는데 이렇게 쓰는 것이 잘못된 것은 아니지만, 링크 역할로 쓸 것이 아니라면(예를들면 탭버튼) 이벤트 리스너 작성시 e.preventDefault(); 를 쓰거나 return false; 를 사용하고 href값에는 #none 정도 붙여넣는 것이 깔끔할 것 같다.
개인적인 취향이겠지만 암튼 난 전자의 방식은 '관심사의 분리'면에서도 좀 아닌거 같다.
현대 프레임워크 시스템에서 관심사의 분리는 무의미한 개념이 되버리는거 같아서 슬프지만, 지킬 수 있는 상황에선 지켰으면 좋겠다.