2012-03-06 5 views
3

JavaScript 압축기를 만들고 있는데 "지역 변수 축소"단계에 있습니다. 나는 압축기의 결과를 다양한 온라인 압축기와 비교해 보았고 Dean Edwards' /packer/으로 흥미로운 것을 발견했습니다.JavaScript의 변수 축소

(function(window, undefined) { 
    var document = window.document, 
     navigator = window.navigator, 
     location = window.location; 
}); 

내 압축기는 다음과 같은 코드를 반환 :

(function(a,b){var c=a.document,d=a.navigator,e=a.location}); 

하지만/포장/반환이 :

(function(a,b){var c=a.document,navigator=a.navigator,location=a.location}); 

의 예로 들어 jQuery 라이브러리의 조각을 보자

/packer /가 var 목록의 첫 번째 변수 이후에 변수를 축소하지 않는 이유가 있습니까? 그것은 단순히 버그입니까, 아니면 이유가 있습니까?

얼핏보기에 그러나 이제 jQuery 라이브러리에서 또 다른 예를 살펴 보자, 내 압축기가 옳은 일을하고 더 나은 최종 결과를 줄 것이다 나타납니다 :

var jQuery = (function() { 

    var jQuery = function(selector, context) { 
     return new jQuery.fn.init(selector, context, rootjQuery); 
    }, 
    // some other vars 
    rootjQuery; 
    // etc... 
}); 

이 조각이 중요하기 때문에 변수 rootjQuery은 정의되기 전에 참조됩니다. 이 경우/포장에서

은/같은 일을 만 목록에서 첫 번째 VAR 압축 : 그것은 rootjQuery를 압축하지 않지만

가 내 압축기 코드를 조금 엉망 그러나
var jQuery=(function(){var c=function(a,b){return new c.fn.init(a,b,rootjQuery)},rootjQuery}); 

때문에를 (아직 정의되지 않았으므로) return 문에 언급 된대로 나중에 정의 될 때 압축합니다.

var jQuery=(function(){var a=function(b,c){return new a.fn.init(b,c,rootjQuery)},b}); 

코드를 실행하려고하면 분명히 오류가 발생합니다.

여기에 어떤 방법이 있습니까? 딘 에드워즈 (Ed Edwards)는이 문제가 너무 커서 첫 번째 var를 압축하여 홀수 번째 경우에 이와 같은 경우가 나타나면 오류가 발생하지 않을 것임을 알았습니다.

정의되기 전에 사용되는 변수를 선택하고 압축하지 않는 것이 좋습니다. 그러나이 경우에는 rootjQuery이 정의 된 것과 다른 범위에서 사용되기 때문에 간단하지 않습니다. 내가 도달 할 때까지 어떤 범위를 정의 할 지 알 길이 없습니다.

+0

확실하지 않습니다. 쉼표를 사용하는 대신에 세 가지'var' 문을 작성하면 부작용에 차이가 없어야하지만 * 세 가지가 모두 작아집니다. – pimvdb

+0

압축을 시도하기 전에 원본 파일 (및 소스 외부에서 들어오는 모든 전역)에 대한 완전한 이해를 구축해야하는 것처럼 들릴 수도 있습니다. 왜 'var v1, v2, v3, ...'목록에서 2, 3 등의 변수를 압축 할 수 없는지 알 수 없습니다. –

+0

rootjQuery 매개 변수에 대한 의견을 보내 주셔서 감사합니다. 시간을 절약하십시오. – Gerry

답변

0

나는 지금 나의 압축기를 고쳤다.

Paul Grime이 의견에서 말했듯이 압축하기 전에 모든 변수와 범위의 전체 목록을 작성해야했습니다.

JavaScript는 정의되기 전에 참조 할 수있게하므로이 문제를 해결할 방법이 없습니다.