문제

함수의 배치가 범위 내에서 클로저의 성능에 영향을 미칩니 까? 그렇다면 이러한 기능을 배치하기에 최적의 장소는 어디에 있습니까? 그렇지 않다면, 묵시적 연관성은 다른 장소에 논리적으로 함수를 배치 할 충분한 이유를 폐쇄하여 묵시적 연관성입니까?

예를 들어, if foo 의 가치에 의존하지 않습니다 현지 상태, 사실을 만듭니다 현지 상태 액세스 할 수 있습니다 foo 에 대한 의미가 있습니다 foo실행 시간, 메모리 사용 등?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

다시 말해, 이것이 더 나은 선택일까요? 그렇다면 왜 그런가?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

다리우스 베이컨 제안했습니다 아래에 위의 두 샘플은 그 이후로 동일합니다 현지 상태 블록 내에서 어디서나 액세스 할 수 있습니다. 그러나 아래의 예는 어디에 있습니다 foo 블록 외부에 정의되어 있습니다. 어떻게 생각해?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
도움이 되었습니까?

해결책

JavaScript의 모든 기능은 폐쇄입니다. 변수의 값을 해결하기위한 런타임은 변수가 함수에 의해 참조되는 경우에만 발생합니다. 예를 들어,이 예제에서 x는 y에 의해 직접 참조되지 않더라도 x의 값을 캡처합니다.

var x = 3;
function y() eval("x");
y();
3

다른 팁

이 두 스 니펫은 모두 사용하는 익명 기능의 (동일한) 환경에 정의되어 있기 때문에 동일합니다. 나는 당신이 액세스 할 수 있다고 생각합니다 localState ~에서 foo 어느 쪽이든.

말하면 ... 당신이 만들고있는 환경에 부조리의 변수가 있다면 foo가변 조회가 더 오래 걸릴 수 있으므로 실행 시간이 영향을받을 수 있습니다. 당신이 정의하는 함수에 더 이상 사용하지 않는 수많은 변수가있는 경우 foo , 그리고 foo 그러면 그것들도 필요하지 않습니다 foo 쓰레기가 수집되지 않아 문제가 될 수 있습니다.

개, 나는 선언의 순서가 JavaScript 통역사가 추상화 할 것이기를 바랍니다. 어쨌든, 성능 차이가 있다면, 조기 최적화의 악을위한 포스터 아이가 될 정도로 최소화 될 것입니다.

Java 스크립트가 기능 스택의 개념을 사용하지 않기 때문에 성능 오버 헤드가있을 것이라고 생각하지 않습니다. 어휘 스코핑을 지원합니다. 폐쇄 통화에 걸쳐 동일한 상태가 진행됩니다. 참고로, 당신의 예에서 당신은 어떤 진술도 실행하지 않는 것 같습니다!

VAR 또는 함수 선언의 범위는 블록의 위치에 관계없이 선언문이있는 전체 블록입니다. 따라서 효율성에 영향을 미치는 것은 놀라운 일입니다.

즉, "function foo ()"이이 블록 내에서 "var localstate"전후에 있는지 여부는 중요하지 않습니다. 그것 5월 "function foo ()"이이 블록에 있는지 또는 둘러싸는 것을 둘러싸고 있는지 여부 (사용하지 않기 때문에 더 높은 범위로 들어 올릴 수있는 경우 어느 로컬 변수); 이는 JavaScript 컴파일러의 세부 사항에 따라 다릅니다.

예에서는 차이가 실제로 중요하지 않습니다. FOO가 전역 범위에 있더라도 문제가 없습니다.

그러나 변수에 함수를 할당하는 스타일을 사용하여 기능을 선언하여 선언하는 순서가 상당히 문제가 될 수 있음을 명심하는 것이 유용합니다.

더 나은 아이디어를 얻으려면 다음 두 가지 예를 사용해보십시오.

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

두 번째와 첫 번째와 첫 번째 차이점은 기능을 선언하는 데 사용하는 스타일입니다. 두 번째는 참조 오류를 생성합니다.

건배.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top