javascript 함수는 toString
메서드를 통해 그 소스코드를 문자열로 재생산 할 수 있다.
방법1
(function(x){
return x+1;
}).toString(); // "function(x){\n return x+1;\n}"
방법2
function test(x){
return x+1;
}
console.log(test.toString())
해커들은 다음과 같은 방법을 이용하기도 한다. 하지만 함수의 toString()
메서드에는 몇가지 제약이 있다.
이말이 무슨소리냐 하면 자바스크립트 엔진에 따라 결과문자열이 달라질수 있고, 문자열을 만들지 않을 수도있다는 말이다.
다음은 실패사례중 하나이다
(function(x){
return x+1;
}).bind(16).toString(); // "function () { [native code] }"
많은 호스트 환경에서 bind메서드 또는 다른 프로그래밍 언어로 되어있기 때문에 자바스크립트 코드를 전혀 갖지 않을 수 있다.
var x = (function(x){
return function(y){
return x+y;
}
})(42).toString();
console.log(x) //"function(y){\n return x+y;\n }"
위의 함수는 크로저이고 x = 42를 바인딩 하고 있음에도 결과문자열이 x로 변수의 참조를 여전히 가지고 있다.
때문에 신뢰하기 어렵고, 함수 소스추출을 사용하기는 매우 복잡하기 때문에 일반적으로는 이 방법을 사용하지 않는다.
기억할 점