[Effective JavaScript] 함수의 toString메서드에 의존하지 말자

김범식·2023년 7월 7일
0

Effective JavaScript

목록 보기
26/33
post-thumbnail

함수의 toString메서드에 의존하지 말자


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() 메서드에는 몇가지 제약이 있다.



1. ECMAScript 표준은 함수의 toString() 메서드의 결과로 나오는 문자열에 대한 어떤 요구사항도 강요하지 않는다.

이말이 무슨소리냐 하면 자바스크립트 엔진에 따라 결과문자열이 달라질수 있고, 문자열을 만들지 않을 수도있다는 말이다.

다음은 실패사례중 하나이다

(function(x){
		return x+1;
}).bind(16).toString(); // "function () { [native code] }"

많은 호스트 환경에서 bind메서드 또는 다른 프로그래밍 언어로 되어있기 때문에 자바스크립트 코드를 전혀 갖지 않을 수 있다.



toString으로 생성된 소스코드는 그 내부 변수 참조에 연관된 크로저의 값을 표현하지 못한다.

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로 변수의 참조를 여전히 가지고 있다.

때문에 신뢰하기 어렵고, 함수 소스추출을 사용하기는 매우 복잡하기 때문에 일반적으로는 이 방법을 사용하지 않는다.
기억할 점

기억할 점

  • 자바스크립트 엔진은 toString()을 통해 함수 소스코드의 정확한 내용을 생성할 필요가 없다.
  • 함수 소스의 정확한 세부 사항에 절대 의존하지 마라. 다른 엔진은 toString에 다른 결과를 만들어 낼 수 있기 때문이다.
  • toString의 결과는 클로저에 보관된 지역 변수의 값을 노출하지 않는다.
  • 일반적인 경우, 함수의 toString을 사용하지 말자
profile
frontend developer

0개의 댓글