2012-04-23 5 views
2

짧은 질문 :JavaScript의 변수 범위

jQuery가 포함되어 있다고 가정 해 봅시다. 이 기능은 다음과 같은 하나보다 ... 빨리

var example1 = (function($, jQuery) { 
    return function() { 
     // do something 
    } 
})() 

를 실행합니다 :

var example2 = (function() { 
    return function() { 
     // do something 
    } 
})() 

를?

jQuery 객체는 undefined이고 두 번째 객체는 상속됩니다. 그래서 두 번째 것은 더 비싸야합니다.

속도를 향상시키고 성능을 저하시키는 상속 된 변수를 제거하는 가장 좋은 방법은 무엇입니까?

jsPerf 시험 : http://jsperf.com/objinheritance

+1

이 질문에 대한 답변을 수 있습니다 : http://stackoverflow.com/questions/9248963/javascript-why-the-access-to-closure-variable-might-be-slow –

+0

두 번째에서는 상속되지 않습니다. , 그럴거야? 그것은 단지 세계화 될 것입니다. 첫 번째 것과 같습니다. 로컬에 액세스하면 여전히 $. window 및 $ window.jQuery 창이 있습니다. –

+1

인용구 : "조숙 한 최적화는 모든 악의 뿌리입니다." JS에서 스코프에 대해 자세히 배우십시오. 그러나 최적화를 위해 최적화하지 마십시오. 이 특정 문제는 코드 조각이 수천 번 (한 번에) 실행될 때만 관련이 있습니다. google에 키워드 : "범위 사슬". 컴퓨터 (CPU) 시간은 개발자 시간보다 훨씬 저렴합니다 !!! –

답변

3

인 ECMAScript에서 정의 된 바와 같이, 기준 해상도은 상기 첫 번째 예에서, $ 변수 코드에서 1 단계가되도록 내부 대 외부 조회 프로세스는이고 두 번째 예에서는 $이 전역 범위에 있지만, 적어도 2 단계 거리가되어 여분의 조회 오버 헤드가 발생합니다.

그러나, 현실 세계에서, (예 V8)를 현대적인 자바 스크립트 엔진 인 ECMAScript는 내용의 정확히 같은 방식으로 참조 해상도를 구현하지 않습니다, 그들은 대부분 즉 flattern 범위 체인에 대한 접근 방식을 가지고 코드에서 모든 변수는, 룩업 오버 헤드을 전혀 사용하지 않고 단일 단계에서 참조 할 수 있습니다.

conslusion : 그들은 정말로 서로 같습니다.

PS :뿐만 아니라 범위 체인, 자바 스크립트 엔진은 프로토 타입 체인에 아주 같은 최적화이 있으므로 속성 조회 오버 헤드 걱정할 필요도 없다.