2014-02-18 2 views
0

나는 javascript에서 return 문으로 고심하고있다.return 문은 내부에서 외부로 작동합니까?

function bin2dec(num){ 
    **return** num.toString().split('').reverse().reduce(function(preVal, currentVal , iterator){ 
     **return** (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
    }, 0); 
    } 

하는의 그래서 = 101

Binary5 작업을 예로 들어 진 5를 사용하자 : 여기 여기 msdn definition

내가 그 진수 진수로 변환 쓴 기능입니다 나는 return 문을 사용할 때마다 현재 함수를 조기에 종료한다고 생각했다.

여기에는 콜백 함수 내에 두 개의 return 문이 있습니다. ,

return num.toString().split('').reverse() // and then the reduce function w/ a call back. 

나는이 '반환'문은 함수의 반환 함수는 숫자를 취 그것을 문자열을 만드는

을 줄이기 위해 기다리고 생각 :

첫 번째 return 문은 두 번째 줄에 분리 한 다음 다시 반전합니다. 그러면 reduce 메소드가 배열에 대해 반복합니다. reduce 함수가 완료되면 첫 번째 반환 값에 의해 반환되는 값을 반환합니다. reduce 함수 반환 값에 대한 자세한 내용은 다음과 같습니다. 콜백에서

:이 케이스 '복귀'에서, 상기 어레이의 각각의 부분을 반복 처리

// 101 
    .reduce(function(preVal, currentVal , iterator){ 
      return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
     }, 0); 

의 '복귀'값으로 전달된다 currentVal === 1. 않는 프레이며 콜백은 preVal의 값입니다. 각 루프에 대해 우리는 현재 val에서 현재의 val을 더하고 추가합니다. 배열의 모든 항목이 반복 될 때 return 문은 최종 값입니다. 그런 다음 최종 값은 아직 실행되지 않은 첫 번째 return 문에서 반환됩니다.

나는 종종 return 문을 잃어버린다. 나는 주로 'return'진술이 내가 묘사하고있는 방식대로 어떻게 행동하는지에 대한 내 논리가 있는지 확인하려고한다. 빠른 정리 해보

  1. 먼저 반환 - 반환하는 객체가 있도록 평가 될 모든 것을 기다립니다.

  2. 둘째 반환이 - 콜백에 사용하고 반복하는 일을 할 때, 마지막 반환 값이 반환되고, 그 값은 궁극적으로 기능의 을 나누기 최초의 return 문에서의 행동이다.

답변

1

how the return statement is defined

return [no LineTerminator here] Expression ; 

를 참조 생략하면

는 반환 값 undefined 그대로 평가되고 있습니다. 그렇지 않으면 반환 값은 입니다.

당신이 볼 때, 다른 return 문에 대한 단어가 없습니다. 표현식은 return 문에서 유효하며 아무런 의미가 없습니다. 무엇 정확히 표현식입니다.


후속 질문은 다음과 같습니다. num.toString().split('').reverse().reduce(...) 정확히 어떻게 평가됩니까?

num.toString().split('').reverse().reduce(...)이고, 표현식은이고이 표현식의 결과는 함수의 반환 값입니다.

따라서 reduce은 어떻게 작동합니까? reduce은 배열을 단일 값으로 변환합니다. 배열의 각 요소에 대해 함수를 실행하고 이전 반복의 해당 함수 반환 값을 다음 반복에 전달하면됩니다.


그래서 결론은 두 return 문은 서로 아무 상관이 없다는 것입니다, 그들은 완전히 독립적입니다. 사전에 함수를 정의했는지 확인하는 것이 더 쉽습니다.

1

이 기능적인 프로그래밍 스타일을 이해하기 어렵다면, 작은 부분으로 나누십시오. 다음 코드는 당신 동일합니다 :

function bin2dec(num) { 
    var decimal = num.toString().split('').reverse().reduce(addDigit, 0); 
    return decimal; 
} 

function addDigit(preVal, currentVal, iterator) { 
    return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
} 

또한 오히려 '코드 블록에서 종료'보다 '값을 산출한다'로 '리턴'을 생각하는 데 도움이됩니다.

+0

감사합니다. 내가했던 것처럼 그것을 구현하는 명확한 이해를 얻으려고 노력하고있다. 실제로 첫 번째 시도에서 현재 코드를 가지고 있지만 하나의 함수로 압축하려고했습니다. 내 현재 버전을 작동 시키려면 return 문을 삽입 할 때 다소 추측되었습니다. 두 반환 문장이 작동하는 방식에 대한 내 논리가 맞다고 생각하지만 올바르게 다시 생각하려고 노력 중입니다. – HelloWorld

+1

@HelloWorld : 귀하의 코드와 귀하의 이해가 모두 좋습니다. 여러분이했던 것처럼 익명의 함수를 사용하는 것이 좋습니다. 내부 함수를 작게 유지하면 가독성이 떨어집니다. –

관련 문제