골때리는 자바스크립트의 세계 8탄

뭐. 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));

이렇게 나오는군요.

오늘 골때리는 자바스크립트는 여기까집니다.

괄호 연산자로 잠시동안 쓸 지역변수를 정의하거나, 아니면 잠시 해야 할 연산을 한 다음에, 마지막에 진짜 연산식을 넣는 가방 역할을 하는 이 괄호 연산자.

그다지 쓸데는 없습니다. 왜냐하면 이건 코드 축소하거나 난독화에 쓰이거든요.

거기다가 이건 고급 테크닉입니다. 이거 작성하는데 에러 잡기 정말 힘들겁니다.

먼저 코드를 어떻게 진행해 나갈지부터 확실히 잡힌 다음에 리팩토링하는 게 좋겠죠.

composite / 2010년 12월 13일 / 미분류

답글 남기기

Your email address will not be published / Required fields are marked *