2015-01-30 3 views
2

비정상적인 자바 스크립트 '패턴'을 실험하고 있으며 상위 범위에서 변수를 선언하는 것이 바람직하지 않은 경우 블럭 범위 지정 방법을 생각할 수 있습니다.함수 범위 if 문

function someFunction() { 
    var x, t; 

    for (x = 0; x < 10000; x += 1) { 
    if (true) { 
     t = x; 
    } 
    } 
} 

하나는 사용하여 별도의 부모 변수를 저장할 수 :

function someFunction() { 
    var x; 

    for (x = 0; x < 10000; x += 1) { 
     if (true) { void function() { 
     var t = x; 
     }(); } 
    } 
} 

그러나, 내 jsperf (http://jsperf.com/scoped-if)를 반복적으로 사용하는 경우이 것을, 5 월을 보여줍니다 대신 예를 들어

, 성능에 부정적인 영향을 미칩니다. 분명히이 결과는 드물게 수행하지 않는 한 앞서 말한 것이 실용적인 패턴이 아니라는 것을 나타냅니다.

는 내가 처음이 단지 1. 내 질문은

,이 패턴은 여전히 ​​주어진 유용 할 수 포함 반면 속도 저하가 실행 컨텍스트 (+ 10000 1)의 반복 생성과 파괴 될 가능성이 있음을 이해 위의 조건 (루프 내에서 사용되지 않음) 및 컨텍스트를 만드는 데 비용이 많이 드는 이유는 무엇입니까?

+0

내가 대신 루프의 내부에 어떤 최적화, 그 최적화하려고하지 않을는, 일반적으로 그 소요 :

더 좋은 방법은 필요한 ES6의 transpiler하다면, let을 사용하는 것입니다 이 계산의 100 %에 가까움 –

+0

이 '패턴'의 목적은 블록 내에서 사용하기 위해서만 변수를 사용하여 부모 범위를 오염시키지 않는 것입니다. – Vix

답변

2

예, IIFEblock scope을 에뮬레이션하는 합리적인 방법입니다.

function someFunction() { 
    var x; 

    for (x = 0; x < 10000; x += 1) { 
     if (true) { 
     let t = x; 
     // Do something with t here 
     } 
     // because it is not defined here 
    } 
    // or here 
} 
// and even a var wouldn't be defined here 

ES6 compatibility table for let

+0

IIFE를 사용하여 블록 범위를 에뮬레이트하는 이유는'''let''' 키워드 대신 하위 호환 가능한 대안을 제공하기 위해서입니다. ES6이 광범위하게 구현 될 때이를 잠재적 인 솔루션으로 제공해 주셔서 감사합니다. 이것이 확실히 사용 방법입니다. – Vix

+1

나는 대답은'let' + Traceur/6to5 또는 node --harmony/io.js가 될 수 있다고 생각하고, IIFE는 할 수없는 곳이라고 생각한다. 하지만 알 수없는 길이의 루프 안쪽 :) – joews