나는이 대개 깊은 구조 내에서 선언 또는 "네임 스페이스"자바 스크립트 폐쇄 성능
//global scope
(function ($, lib) {
//function scope 1
var format = lib.format, // instead of calling lib.format all the time just call format
touch = lib.pointer.touch, //instead of calling lib.pointer.touch each time just touch
$doc = $(document),
log = logger.log; //not console log...
$doc.on('app:ready', function() {
//function scope 2
$doc.on('some:event', function (e) {
//function scope 3
//use the cached variables
log(format('{0} was triggered on the $doc object', e.type);
});
$doc.on(touch, function (e) {
//function scope 3
log(format('this should be {1} and is... {0} ', e.type, touch);
});
});
}(jQuery, lib));
I이었다되는 함수의 특성 값을 캐시 같은 것을 할 자바 스크립트 잠시 동안 작동되는 , 쓰기, 터치 공상 자동 완성 강력한 십오이에 도움이 될 경우에도, lib.pointer.touch를 작성하는 것을 더 매력적 보인다 나는대로
- 게으른, 터치 짧은 : 그 때문에 일을.
- 최소화 부는 단일 문자 변수에 그 하나의 개인 변수를 변환 할 수 있습니다, 그래서 또한 나를 위해 감각을했다 (너무 빨리 최적화하지, 나도 알아, 알아,하지만 내가 추측 안전 것 같다)
그런 식으로 작성된 모든 코드는 모바일 장치 및 데스크톱 브라우저에서 제대로 수행되는 것처럼 보입니다. 따라서 안전한 방법 인 것 같습니다. 함수가없는 외부 환경에서 변수 (자유 변수를 사용합니다 않습니다하지만
... 나는이 폐쇄에 의존하기 때문에, 및 내부 기능이 궁금 선언 된 컨텍스트를 저장하는 폐쇄를 만들어야합니다) ... 클로저 컨텍스트가 아직 저장되어 있습니까? (또는 ia 나무가 나무에 떨어지고 아무도 그 소리를들을 수 없다면 여전히 충돌 소리를 내는가? hehe) ECMA는 저장이 필요한지에 대해 언급하지 않기 때문에 javascript 엔진간에 이러한 차이가있을 수 있음을 알고 있습니다. 외부로부터의 변수가 액세스되지 않을 때의 컨텍스트.
위 표현이 맞다면 ...이 코드 블록이 더 효율적입니까? 그것은 자기 즉시 호출 함수에 해당 변수를 전달하기 때문에
//global scope (function ($, lib) { //function scope 1 var format = lib.format, touch = lib.pointer.touch, $doc = $(document), log = console.log; $doc.on('app:ready', function() { (function ($doc, touch, lib, format) { // since all the variables are provided as arguments in this function // there is no need to save them to the [[scope]] of this function // because they are local to this self invoking function now $doc.on('some:event', function (e) { //function scope 3 //use the cached variables log(format('{0} was triggered on the $doc object', e.type); }); $doc.on(touch, function (e) { //function scope 3 log(format('this should be {1} and is... {0} ', e.type, touch); }); }($doc, touch, lib, format)); }); }(jQuery, lib));
신뢰할 수있는 방식으로 내 자바 스크립트 라이브러리의 메모리 소비를 올바르게 측정 할 수 있습니까? 나는 전역 컨텍스트에 변수가 누출되지 않도록하기 위해 대부분 자체 자바 스크립트 모듈을 즉각적인 자체 호출 함수 안에 100 배나 가지고있다. 그래서 그들은 모두 위에서 언급 한 코드 블록과 매우 유사한 모듈로 싸여 있습니다.
변수를 더 가까운 곳에 캐시하는 것이 더 효과적일까요? 그렇다면 변수 선언을 반복적으로 사용하여 어디에서 사용할지를 다시 말해야합니다.
현재 로컬 컨텍스트가 아닌 변수를 찾고 엔진이 먼저 부모 범위를 조사하여 해당 레벨의 모든 변수를 반복합니다 ... 레벨 당 변수가 많을수록 아마도 변수를 찾는 성능 일 것입니다.
내부 클로저에서 정의되지 않은 변수를 찾으려고하면 정의가 전역 범위까지 부모 범위에서 처음으로 검색되므로 엔진을 찾지 않아도됩니다. 글로벌 범위. 그게 사실이야? 이러한 종류의 조회를 최적화하는 엔진입니까?
결국 ...두 번째 예제로 코드를 구현하고 싶지는 않을 것이라는 것을 알고 있습니다. 왜냐하면 코드를 읽기가 더 어렵게 만들 것이고, 첫 번째 방법을 사용하여 최종 출력 크기를 최소화 할 수 있기 때문입니다. 내 질문은 호기심에 의해 동기를 부여하고 좀 더 자바 스크립트의 정말 좋은 기능을 이해하려고합니다. 이 테스트에 따라서
은 ...이 두 번째 방법이 더 빠른 것 같다. 그러나 미친 번 반복 할 때만 분명합니다 ... 지금은 코드가 반복 횟수를 수행하지 않지만 ... 코딩 방법 때문에 메모리를 더 많이 소비하고 있습니다.
업데이트 : it 이 질문이 너무 큽니다. 죄송하지만 작은 부분을 부수려고합니다. 이 질문은 내가 말했듯이 대부분 호기심에 자극을 받았다. 모바일 장치에서도 성능이 무시할 수있을 것 같다. 모든 의견을 보내 주셔서 감사합니다.
자세한 답변은 없지만 며칠 전에 발견했습니다. http://www.developer.nokia.com/Community/Wiki/JavaScript_Performance_Best_Practices –
아주 긴 질문입니다. 문제를 해결해야 할 수도 있습니다. – Bergi
그래, 아마 너무 길지만 모두 같은 문제와 관련이 있습니다. 나는 그것을 단축 시키거나 코드 예제를 jsfiddle로 이동시켜 더 짧게 만들려고 노력할 것이다. 덕분에 –