옛날 코드에서는 void라는 키워드를 자주 보았을 것이고, 리턴 타입을 정의해야하는 언어를 사용하는 개발자라면, 수도 없이 보았을 만한 키워드이다.
하지만, 자바스크립트 기준으로 생각을 해보자.
void function test() {
console.log('called test')
}
test()
위와 같은 코드르 보자, 자바스크립트를 배우지 않았지만, c라이크 언어를 배운 사람이라면, 아 test함수에는 반환값이 없구나 하고, 넘어갈 코드이다. 하지만....
Uncaught ReferenceError: test is not defined
저 코드에는 test자체가 존재 하지 않는다. 옛날의 자바스크립트에서는 undefined가 읽기 전용 이 아니라, 쓰기가 가능한 변수였다. 그래서 undefined를 재정의 할 수 있었기에,
undefined = void 0;
function foo(undefined) {
var a;
console.log(a === undefined)
}
foo()
위 처럼 void가 평가가 항상 undefined인 것을 고려하여, 위와 같이 undefined를 안전하게 관리하거나, 함수의 가장 마지막 인자를 항상 undefined로 이름으로 정의하여, undefined를 안전하게 관리 하였다.
이젠, undefined를 재정의 할 수 없으니, 절~~대 사용하면 안되는 방식이다.
그렇다면, 이제 void 키워드는 더 이상 쓰지 않을만한 내용일까?
https://sejiwork.blogspot.com/2021/10/javascript-pseudo-protocol.html
a 태그 사용 시 click 이벤트만 사용 할 때에 사용 할 수 있긴 하지만.... 이걸 써야 할 까? 이 생각은 머리에서 떠나지 않는다. button태그가 있는데 굳이?
우리는 자바스크립트 사용자라면, function 보다는 arrow function이 짧기 때문에, this키워드를 사용 하지 않는 경우 arrow function을 더 선호할 것이다.
하지만, arrow function의 경우 암묵적 리턴을 허용한다.
const macroConsole = {
log: (msg) => setTimeout( console.log( msg ) )
}
macroConsole.log('123')
위의 경우는 그냥 예시 일 뿐이다. console.log를 위 처럼 만들면, 첫 인자만 가능하기 때문에, arguments를 허용하는 function을 사용 하는 것이 맞을 것이다.
여기서 눈여겨 볼 것은, 리턴값이다.
macroConsole.log('123')
결국 macroConsole.log의 리턴값은 setTimeout의 리턴 값을 갖는다. 하지만 그것이 의미가 있는가? console.log의 리턴값으로 맞추어주는 게 더 맞지 않을까? 라는 내용이다.
const macroConsole = {
log: (msg) => setTimeout( console.log( msg ) ),
logVoid: (msg) => void setTimeout( console.log( msg ) )
}
const logRes = macroConsole.log('123')
console.log('logRes', logRes) // logRes 1
const logVoidRes = macroConsole.logVoid('123')
console.log('logVoidRes', logVoidRes) // logVoidRes undefined
사실 뭐 암묵적 리턴이 안되게 expression이 아니라 statment로 작성 하는 것도 방법이긴 하다.
void 필요한가....? 아직도 deprecated가 안된 것이 애매하긴 하다.
댓글
댓글 쓰기