2013-08-26 6 views
3

나는 모든 종류의 이름 오염을 피하기 위해 (function() {/.../})()에 멋지게 싸인 긴 스크립트를 가지고있다. 제로 경고와 함께 100 % 입력됩니다.원래 이름 공간이 비어있는 경우 Google 클로져 컴파일러가 변수를 전역 네임 스페이스에 추가하는 이유는 무엇입니까?

Google 클로저 컴파일러는 불필요하고 위험한 느낌을주는 글로벌 네임 스페이스에 ij을 다시 정의함으로써 시작된다는 것을 알았습니다. 특히 네임 스페이스에 간섭이없는 스크립트를 컴파일하고 있기 때문에 더욱 그렇습니다. 컴파일 된 스크립트는 var i=null,j=!1;으로 시작합니다.

나는 주위를 --output_wrapper을 사용하여 감싸는 작업을 생각할 수는 있지만, Google이 이런 이름 공간을 오염시키는 이유를 생각할 수 없습니다.

있습니까?

+0

[이 유사한 예이다 (https://groups.google.com/forum/#!topic/closure-compiler-discuss/ZLrYebO3DDs)의 – abc123

+0

중복 가능성 [개명 컴파일러에서 폐쇄를 방지하는 방법 " 사실 ","거짓 "및"null "] (http://stackoverflow.com/questions/4618571/how-to-prevent-closure-compiler-from-renaming-true-false-and-null) – Alexander

+0

아니, 나는 래퍼 트릭에 대해 이미 알고 있었다. 광산이 비어있는 동안 전 세계적인 범위를 추가 할 이유를 찾고있었습니다. 대답은 것 같습니다, 폐쇄 컴파일러는 내 범위가 비어 있는지 여부를 차가 아니며, 단지 그것을 사용할 수 있다는 가정을합니다. –

답변

9

컴파일러는 모두 관련 JavaScript를 제공하므로 다른 스크립트와의 충돌에 대해 걱정할 필요가 없습니다. 따라서 "불필요한"익명 함수를 래핑 할 수 있다고 가정합니다. FAQ에서

:

고급 최적화를 사용하여, 폐쇄 컴파일러는 전역에 새로운 변수를 추가합니다. 내 변수가 페이지의 다른 스크립트와 충돌하지 않도록하려면 어떻게해야합니까?

클로저 컴파일러의 고급 최적화 모드에서는 전역 변수에 새 변수를 추가하는 것이 좋다고 가정합니다.

JavaScript에서는 익명의 함수로 코드를 래핑하여 변수가 전역 범위를 오염시키지 않도록하는 것이 일반적입니다. Closure Compiler는이 목적을 위해 --output_wrapper 플래그를 가지고 있습니다. --output_wrapper "(function() {%output%})();"으로 호출하면 컴파일 타임에 익명의 함수로 코드가 래핑됩니다.

클로저 컴파일러 사용자는 원래 소스 코드에 익명 함수 래퍼를 작성하는 대신 컴파일 할 때이 래핑을 더 쉽고 간단하게 수행하는 경우가 많습니다.

+0

사실. 그것을 생각해 보면 Closure는 네임 스페이스를 오염시키지 않을 것을 결코 약속하지 않았습니다. 그래서 컴파일러는 범위를 보호하기로 결정했는지 여부를 알기 위해 귀찮게하지 않았고, --output_wrapper를 사용하지 않는 한, 전역 범위에 물건을 추가 할 것입니다. –

+0

'ECMASCRIPT5_STRICT' 모드에서'--output_wrapper'를 사용하여 컴파일 할 때, 익명 래퍼 함수의'this' 값은 수동으로'window' 객체에 바인드되어야합니다. ((function() {% output %})) . 콜 (창)'. 그렇지 않으면 'this'는 '엄격 모드'에서 전역 객체를 참조하지 않습니다. –

+0

Closure의 전역 범위 오염에 대한 'output_wrapper'해결 방법은 전역 범위를 오염시키지 말라는 단순한 옵션에 비해 열등한 것처럼 보입니다 ... 그리고 실제로 모든 경우에 문제를 해결하지는 못합니다. 내 상황에서는 래퍼에 의해 감추어 져서 외부 JS에 의한 접근을 막고 내 라이브러리를 깨뜨리는 전역 메소드 (실제로는 '타입'을위한 생성자)가있다 :- ( –