2014-09-13 3 views
0

저는 현재 초당 10 배의 속도로 이벤트 리스너에서 실행되는 JavaScript 프로그램의 모든 마지막 밀리 초를 압축하려고합니다. 나는 모든 벼락을 제거하려고 노력하고있다. if 블록의 유일한 목적이 return 일 경우, else if 또는 else을 따르는 데 어떤 이점이 있습니까, 아니면 제가 else을 잊어 버렸다고 생각하는 것입니다.if 블록이 JavaScript로 반환되면 else가 필요합니까?

예 :

// with else 
function withElse() { 
    if (foo) { 
     return foo; 
    } else if (bar) { 
     return bar; 
    } else { 
     return baz; 
    } 
} 

// without else 
function withoutElse() { 
    if (foo) return foo; 
    if (bar) return bar; 
    return baz; 
} 
+0

을 수정하시기 바랍니다. 그러나이 방법은 테스트하기가 쉽고 단 한 번도 수행 할 필요가 없습니다. – Shomz

+0

개인적으로 나는'return'을 가진 블록 다음에'else'는 일종의 반 패턴이라고 생각합니다. 그렇다면 어떤 사람들은 함수의 중간에있는'return '이 나쁜 것이라고 생각합니다. – Pointy

+1

가능한 복제본은 무엇입니까? if..else 또는 여러 단순 if] (http : // stackoverflow.com/questions/4139496/what-is-better-if-else-or-multiple-simple-if) –

답변

4

아니요, 없습니다. 명확하게하기 위해 선택할 수도 있지만 필수는 아닙니다 (중복을 피하기 위해 이 아닌을 선택할 수도 있습니다. 완전히 스타일 선택입니다). 둘 다 성능의 관점에서 그 일 문제의

(마찬가지로, 당신은 항상 블록 명확성을 위해   — {...}   —하도록 선택할 수 있지만,이 중 필요 아닙니다.)

.

function withElse() { 
    var rv; 

    if (foo) { 
     rv = foo; 
    } else if (bar) { 
     rv = bar; 
    } else { 
     rv = baz; 
    } 

    return rv; 
} 

더 자세한하지만 단일 위치에서 함수가 종료, 디버깅에 유용 할 수있는 장점이있다 :

가 고려해야 할 제 3의 선택입니다. 물론 단점은 ... 더 장황한 것입니다. :-)

단순한 엔진에서 세 번째 선택의 성능 페널티는 아주 작을 수 있습니다. 현대적인 브라우저에서 볼 수있는 것과 같은 최적화 엔진에서, 나는 그것을 의심한다.

+0

또는'return foo? foo : 바? bar : baz;', 또는'return foo || 바 || baz; –

+0

@ 토라자부로 : LOL 예, 가독성/디버깅 (다른 방법이 아닌 첫 번째 예)으로 가고 싶다면. ;-)하지만 조건과 반환 값이 실제로 같은 것이 아니라고 가정합니다 ... –

+1

@torazaburo'switch {case foo : return foo; 케이스 바 : 리턴 바; case baz : return baz;}' –

0

질문에 답해도 두 프로그램간에 차이가 없으며 원하는 경우 제외 할 수 있습니다.

그러나 @torazaburo는 "else의 컴파일 시간은 마이크로 초 또는 2 분의 1입니다."라고 말했습니다. 하지만, 내가 아는 한, 런타임에는 아무런 차이가 없으므로이 함수를 초당 1000x라고 부르는 경우에도 아무 것도 최적화하지 않습니다.

if (foo) { 
    return foo; 
} else if (bar) { 
    return bar; 
} else { 
    return baz; 
} 

이 같은 (그러나 어셈블리)에 (바보 컴파일러에 의해) 컴파일됩니다

1. ifnot (foo) goto line 4; 
2. return foo; 
3. goto line 9; 
4. ifnot (foo) goto line 7; 
5. return foo; 
6. goto line 9; 
7. ifnot (foo) goto line 9; 
8. return foo; 
9. 

반대 :

if (foo) return foo; 
if (bar) return bar; 
return baz; 

것 :

1. ifnot (foo) goto line 3; 
2. return foo; 
3. ifnot (foo) goto line 5; 
4. return foo; 
5. ifnot (foo) goto line 7; 
6. return foo; 
7. 

성능이 동일합니다! (나는 또한 읽기 쉽도록 두 번째를 선호!)

시 : 당신은 내가 아무 잘못을 말하고 생각한다면, 당신이 올바른지 믿고 나에게

관련 문제