프로그램개발/ClientSide(JavaScript,Angular,Vue)

골때리는 자바스크립트.8

크레도스 2014. 2. 6. 15:31

뭐. 8탄이라. 점점 골때려져 가겠는데 이게 웬 8탄이냐.. 
이번엔 어려워서 골때릴 것 같다구요? 
뭐.. 아무렴 어때요.ㅋㅋ 

제가 6탄에서 스크립트 난독화에 대해 설명을 한 적이 있었습니다. 
그기서 난독화 테크닉에 괄호한테 십쇼키라고 욕했죠. 
ㅋㅋ 근데 가끔씩 유용합니다. 왜그럴까요? 
그전에 있어서 괄호가 어디어디 쓰이는지부터 보도록 하죠. 

var s=0; 
for(i=1;i<=100;i++){ 
  s+=i; 
} 
alert(s); 

뭐. 일단 쉽게 1부터 100까지 더하는 반복문입니다. 
그렇다면 이걸 일반적인 다른 방법이 있다면, 

var s=0,i=1; 
while(i<=100) 
  s+=i++; 
alert(s); 

그럼 함수는.. 

function(a,b){ 
  return a+b; 
} 

그리고 또는 1탄에서 언급한 기술.. 

(function(a){alert(a);})('안녕'); 

아니면 

alert(({a:'b',c:'d'}).a); 

괄호는 우리 코딩이나 프로그래밍 생활에 정말 유용하게 쓰이는 녀석입니다. 

자 그렇다면, 6탄에서 본적 있죠? 

var a=(b='이런',b+'젠장'); 
alert(a); 

이 스크립트를 실행하면 이런젠장이란 글씨가 뜹니다. 
a는 함수인가요? 아닌뎁쇼. 
그럼 뭡니까? 몰라요. 그렇다는데요? 
저보다 자스천재님이 가르쳐주실지도...ㅋ 

어쨌든, 난독화에 쓰이기도 하고, 일회성도 있기 때문에 잠시 써먹는 식으로도 그만이죠. 
예를 들어, 

while(Math.round(Math.random())){ 
  a=1; 
  window.status+=a; 
} 

이 a는 어자피 while 문 안에서만 쓸 거 아닙니까? 그럼 그냥 이렇게 하세요. 

while(a=1,Math.round(Math.random())){ 
  window.status+=a; 
} 

어째보면 좀 의미가 있군요. 여기서 지역변수 a는 1로 정의했다고 보이기도 하고, 
그리고 조건문은 뒤에 썼죠. 실제로 while 문이 인식할 건 마지막 인자니까요. 

6탄에서도 말했지만 (1,2,...,n) 이런 괄호 연산자 실행시 결과는 무조건 
마지막에 쓴 n이 나옵니다. 

그래서 이걸 활용한 별 희한한 식이 나오기도 하죠. 
v.push((c=arguments[i],l=c.length>4?2:1,parseInt((h=c.substr(1+j*l,l),h+(l>1?'':h)), 16))); 

이걸 제가 직접 작성했다고 자랑하긴 좀 뭐하죠. 
이걸 풀어보면 어떻게 될까요? 풀어봅시다. 


c = arguments[i]; 
l = c.length > 4 ? 2 : 1; 
h = c.substr(1 + j * l, l); 
h = h + (l > 1 ? '' : h); 
v.push(parseInt(h,16)); 

이렇게 나오는군요. 

오늘 골때리는 자바스크립트는 여기까집니다. 
괄호 연산자로 잠시동안 쓸 지역변수를 정의하거나, 아니면 잠시 해야 할 연산을 한 다음에, 마지막에 진짜 연산식을 넣는 가방 역할을 하는 이 괄호 연산자. 

그다지 쓸데는 없습니다. 왜냐하면 이건 코드 축소하거나 난독화에 쓰이거든요. 
거기다가 이건 고급 테크닉입니다. 이거 작성하는데 에러 잡기 정말 힘들겁니다. 
먼저 코드를 어떻게 진행해 나갈지부터 확실히 잡힌 다음에 리팩토링하는 게 좋겠죠.

출처 : javascript - 웹미니 (http://www.webmini.net/?mid=javascript&document_srl=196956)