2014-08-27 4 views
2

다음 두 코드 예제 (속도 별, 모범 사례 등)에는 차이점이 있습니까?자바 스크립트 속도 : 범위 또는 변수

이 :

function() { 
    var me = this; 
    me.doSomething(); 
    me.doAnotherThing(); 
}; 

또는이 :

function() { 
    this.doSomething(); 
    this.doAnotherThing(); 
} 

내가 범위를 여러 번에 호출하는 경우 차이가 있습니까? 변수를 사용하거나 범위를 사용합니까?

답변

4

JavaScript에서는 범위가 상속됩니다. 따라서 부모 범위에서 변수에 액세스하려면 엔진은 먼저 현재 범위를보고 거기에 있는지 확인한 다음 부모 범위에서 검색합니다. 그것은 당신이 요구하는 것을 발견 할 때까지 계속 될 것입니다.

this 변수는 로컬 범위 (실제로는 활성화 개체에 있음)에서 사용할 수 있으며 엔진은 즉시이를 해결할 수 있습니다. 따라서 캐시 할 성능상의 이유가 없습니다.

그러나 부모 범위에서 변수에 액세스 할 때이 점이 흥미 롭습니다. 예를 들어 함수에서 여러 번 전역 범위의 document 변수에 액세스한다고 가정 해 보겠습니다. 현대 JS 엔진의 대부분을 최적화 할 수 있기 때문에 이것은 theorical 방식으로 더 재미있는 오늘의로,

function foo() { 
    var doc = document; 

    doc.getElementsByTagName('body'); 
    doc.querySelectorAll('div'); 
} 

어쨌든 : 그것을 캐싱함으로써, 엔진은 따라서 성능을 향상 한 번이를 해결해야합니다 멋지게 (http://jsperf.com/scope-resolution-cached-not-cached).

1

:


범위 지정 상속은 자바 스크립트 언어의 중요한 부분입니다, 난 강력하게 더 나은 이해를 위해이 두 수치를 추천 그들은 을 제외하고는 둘 다 동일합니다. 나를 주요 상황을 참조 할 것 동안이 항상 호출 컨텍스트의 참조합니다 때문에 주 일 안에 다른 컨텍스트가있을 때 매우 유용 할 수 있습니다

.

function MainFunction(){ 
    var me = this; 

    function secondFunction(){ 
    // this refers to this anonymous function 
    this.varName = 'something'; 
    // me is a reference to MainFunction 
    me.varName = 'something'; 

    } 

} 
+0

빠릅니다. 그러나 CPU와 메모리 모두에서 중요한 성능 저하가 발생합니다. 객체 래퍼와 같이 여러 번 인스턴스화 된 클래스를 만들 경우 프로토 타입 상속을 사용해야합니다. – jgmjgm

0

내가 범위를 여러 번에 호출하면 차이가 있습니까?

변수에 this 만 할당 한 동일한 작업을 수행하기 때문에 변수에 비해 여러 번 범위를 호출 할 때 차이점은 없습니다.

변수를 사용하거나 범위를 사용합니까? 때로는 this이 다른 것으로 섞이지 않도록 캐싱해야하기 때문에 상황에 따라 다릅니다. 이걸 고려하세요.

function blabla() { 
    var thisis = this; 
    $.each(function() { 
    //`this` here is not equal to `thisis` so if you need `thisis` here you will assign to a variable first. 
    }); 
} 

여기에 jquery을 사용하여 죄송합니다.

1

특정 질문에 대답하고 너무 이론적이지 않으려면 두 예제간에 속도면에서 매우 작은 차이가 있습니다.

추가 변수 조회를 생성하면 스크립트 속도가 약간 느려집니다. 변수 생성은 하나의 추가 작업이므로 두 코드는 본질적으로 동일합니다. 멤버 함수를 사용하여 객체를 생성하기 때문에 수천 개의 객체가있는 경우 성능이 크게 저하 될 수 있습니다.

항상 그렇듯이 성능은 브라우저마다 다를 수 있습니다. 제외 변수 정의

오페라 빠른 -

http://jsperf.com/variable-caching-this

/초

크롬 36.0.1985.143 분옵스에서 찾는 위치 : 여기에 차이가 최소임을 보여주는 jsPerf test입니다 24.0 - 변수 정의 제외가 빠릅니다.

파이어 폭스는 31.0 - 변수 정의를 제외하면 빠릅니다

IE 11이 - 변수 정의를 제외하면이 개인 회원과 복잡한 자기 건물 객체에 좋은 곳입니다

+0

사실이 대답은 제가 요구 한 것이지만, aymericbeaumet은 더 많은 정보를 가지고있었습니다. 다른 사용자가 자세한 대답을 쉽게 찾을 수 있도록하기 위해 나는 그의 대답을 '최상의 답'으로 표시하기로 선택했습니다. 개인적으로 나는 추가 된 링크로 인해 내가 찾고있는 정보를 정확하게 발견했습니다. 고마워. – Dinkheller

+0

이 답변이 귀하의 질문과 더 관련이 있다면, 그것을 수락하십시오;) 해당 투표 수에 따라 광산이 아래에 표시됩니다. – aymericbeaumet

+0

@Alex W : 당신의 요점에 동의하지만, 제가 투쟁하고있는 부분이 있습니다. 'JavaScript가 이미 객체의 프로토 타입에 이것을 저장하고 있습니다. '라는 내용의 소스가 있습니까? AFAIK는 실행 컨텍스트에 저장됩니다 (사용자가 액세스 할 수 없음). – aymericbeaumet