자바스크립트에서 eval()은 사악한(evil) 함수이다.


동적인 프로퍼티에 접근할 때에는 대괄호 표기법이 더 간단하고 좋다.


//안티 패턴
var obj = {name:"javascript"};
var property = "name";
alert(eval("obj."+property))
// 권장 패턴
var obj = {name:"javascript"};
var property = "name";
alert(obj[property])






setInterval(), setTimeout(), Function() 인자로 문자열을 넘기는 것도 eval()과 비슷하다.


반드시 eval()을 사용해야 한다면 

  1. new Function()으로 감싸서 사용하자.
    Function() 생성자로 감싸게되면 유효영역이 새로 만들어져 var 선언 변수들이 전역에 선언되는 경우를 막을 수 있다.
  2. eval() 호출을 즉시실행 함수로 감싸서 실행되도록 하자.
console.log(typeof un);    // undefined
console.log(typeof deux);    // undefined
console.log(typeof trois);    // undefined

var jsstring = "var un = 1; console.log(un);";
eval(jsstring);    // "1"

jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)();    // "2"    // 생성자로 생성한 함수를 바로 호출한다. 
     // 유효범위가 새로 생기므로 deux는 로컬변수가 된다.

jsstring = "var trois = 3; console.log(trois);";
(function() {
   eval(jsstring);
}()); // "3" // eval()을 함수로 감싸고 그 함수를 즉시 호출한다. trois 또한 함수의 로컬변수가 된다.

console.log(typeof un);        // "1"
console.log(typeof deux);   // "undefined"
console.log(typeof trois);    // "undefined"


eval()과 Function()의 또다른 차이


eval()은 자신의 유효범위 다음으로 자신을 감싸는 유효범위를 바라보고 있다.

하지만 Function()은 자신의 유효범위 다음으로 전역 유효범위를 바라보고 있다.

따라서 eval()은 유효범위 체인에 간섭을 일으킬 수 있다.

(function () {
	var local = 1;
	eval("local = 3; console.log(local);");    // 3이 출력된다.
	console.log(local);    // 3이 출력된다. 감싸고있는 함수의 local 변수의 값을 바꿔버린다.
}())

(function () {
	var local = 1;
	Function("console.log(typeof local);")();    // undefined가 출력된다. 
	// Function 객체의 상위 유효범위는 전역.
	// 전역에 local 변수가 없으므로 undefined.
}())

'WEB > javascript' 카테고리의 다른 글

객체 생성자의 함정  (0) 2012.07.22
자바스크립트 리터럴 표기법  (0) 2012.07.22
호이스팅(hoisting): 분산된 var 선언의 문제점  (0) 2012.07.12
자바스크립트 전역변수  (0) 2012.07.10
strict mode  (0) 2012.07.10

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-1-lexical-environments-common-theory/#more-1751


분석해보고 정리하겠음.



프로그램을 실행시키는 스크립트를 작성 한 후,


~$ vim runscript

~$ sudo +x runscript

~$ cp runscript /etc/init.d/

~$ sudo update-rc.d runscript defaults


를 해주면 

../etc/init0.d/XXXrunscript

../etc/init1.d/XXXrunscript

../etc/init2.d/XXXrunscript

../etc/init3.d/XXXrunscript

../etc/init4.d/XXXrunscript

../etc/init5.d/XXXrunscript


로 스크립트 파일이 자동 실행되게끔 등록이 된다.



근데 난 왜 안되지.......ㅜㅜ



연가시 (2012)

6.9
감독
박정우
출연
김명민, 문정희, 김동완, 이하늬, 엄지성
정보
드라마, 어드벤처 | 한국 | 109 분 | 2012-07-05


지난 토요일 죽전 cgv에서 심야영화로 연가시를 보았다.

밤 11시가 다 된 시간이었는데 사람이 엄청 많았다. 영화의 인기인가 영화관의 인기인가 ㅋㅋ

장마가 일주일동안 지속된 원인도 있는것 같았다.



좀 시시한 내용일 것 같았는데

기대를 많이 안해서인지 생각보다 긴장감 넘쳤다.


연가시들이 번식을 하려고 발악을 하다가

사람 몸에서 튀어나온 장면은..-_-


곱등이에 있는 연가시만 보다가

사람몸에있는 연가시를 보니 토할것 같았다. 웩..



인간들의 탐욕이 부른 재앙.

연가시의 숙주가 인간이 되도록 인위적으로 돌연변이를 시켰다고는 하지만 영 찝찝하다. 

요즘 환경오염도 심각하니까 돌연변이가 나타날 가능성은 없다고 장담 할 수 없을것 같다.



올 여름 휴가, 고민된다. 워터파크 가기로 했는데......

조아제약 윈다졸 미리 사놓을까ㅋㅋㅋㅋㅋㅋ

'여가 > movie' 카테고리의 다른 글

이웃사람.  (0) 2012.09.02
도둑들 심야영화  (0) 2012.08.12
myname = "global";
function func() {
	alert(myname);
	var myname = "local";
	alert(myname);
}
func();


의도된 결과는




였을 것이다.


하지만. 자바스크립트에는 hoisting이라는 성질이 있다.


myname = "global";
function func() {
var myname;            // undefined
alert(myname);
myname = "local";
alert(myname);
}
func();



myname 라는 변수의 선언이 scope의 맨 위로 올려져 undefined 값으로 설정된다.


따라서 결과는







'WEB > javascript' 카테고리의 다른 글

자바스크립트 리터럴 표기법  (0) 2012.07.22
eval() 안전하게 사용하는 방법  (0) 2012.07.22
자바스크립트 전역변수  (0) 2012.07.10
strict mode  (0) 2012.07.10
객체지향 언어  (0) 2012.07.09



프로그램을 실행하다보면 어떤 함수에서 JVM에서 OutOfMemory 예외가 발생하는 경우가 종종 있다.

예상보다 메모리를 과하게 잡아먹는다면 실제 필요한 메모리가 얼마인지 알아내야 한다.


힙 최대 메모리 사이즈를 늘려 준 후.

-Xmx2048m 으로 주면 충분할 듯..

private static final Runtime runtime = Runtime.getRuntime();

{
	...
	
	double start, end;                // 실행 전후 메모리 기록 변수
	start = measureHeap();     // 실행 전 메모리 기록
	CC res = run();                           // 메모리 예외발생하는 문제의 함수 콜
	end = measureHeap();      // 실행 후 메모리 기록
	System.out.format(" %10.6f", end - start);    // 콘솔 출력
	System.out.flush();
	...
}

private static double measureHeap() {
	for (int i = 0; i < 4; i++)
		_runGC();
	return ((double) (usedMemory())) / 1048576.0d;
}
private static void _runGC() {
	long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
	for (int i = 0; (usedMem1 < usedMem2) && (i < 500); i++) {
		runtime.runFinalization();
		runtime.gc();
		Thread.yield();
		usedMem2 = usedMem1;
		usedMem1 = usedMemory();
	}
}
private static long usedMemory() {
	return runtime.totalMemory() - runtime.freeMemory();
}


수행을 하면, 임시적으로 사용한 메모리를 제외한(GC) 크기가 출력된다.


'NATIVE > eclipse' 카테고리의 다른 글

External Tools로 빌드  (0) 2012.07.11
java.lang.StackOverflowError  (0) 2012.07.10
java.lang.OutOfMemoryError  (0) 2012.07.10


sun-java6-jdk 를 설치하려면 apt-get으로는 불가능하다.

apt-get java명령은 openJDK 를 설치한다.


http://tenisland.tistory.com/176


위 블로그를 통해 sun-java를 설치할 수 있다.






삽질했던게...

apt-get으로 ant를 설치하고 나서 sun-java를 설치했다.


그런데 정상빌드가 되야하는 소스가 빌드오류가 나는것이 아닌가. 컴파일러 문제라며 뻗었다.

혹시나 sun-java를 지워도 java는 /usr/bin에 계속 살아있고...-_- 좀비같이....


알고보니 ant에 java가 디펜던시가 있어 openJDK가 같이 설치된 줄 모르고

엄한 sun-java만 탓했었다...... 미안 ㅋㅋㅋ


앞으로는 디펜던시 잘 보고 설치하자.






외부 빌더를 통해 빌드하는경우 내장 빌더의 자동빌드 체크는 꺼주자.

이것때문에 에러난다고 런이 안되는 경우가 발생한다-_-



예로,

이클립스에서 ant builder를 사용하여 스칼라 코드를 빌드하는 경우에는

내장 스칼라 빌더는 참견하지 않게 하는것이 심상에 좋을 것이다.







'NATIVE > eclipse' 카테고리의 다른 글

자바 프로그램 힙 메모리 사용 측정  (0) 2012.07.11
java.lang.StackOverflowError  (0) 2012.07.10
java.lang.OutOfMemoryError  (0) 2012.07.10

+ Recent posts