2015-01-20 14 views
4

자바 스크립트 세계에 처음 들어선 사람입니다.JavaScript의 중첩 함수는 어떻게 작동합니까?

function sum (a) { 
    var sum = a; 

    function f (b) { 
     sum += b; 

     return f; 
    } 

    f.toString = function() { 
     return sum; 
    } 

    return f 
} 

//Calling the function 
console.log(sum(4)(5)); 

당신이 f.toString이 실행될 때 나를 이해하는 데 도움이 바랍니다 수 : 오늘 자바 스크립트와 함께 작업하는 동안 나는 다음 코드를 발견?

+6

여기'console.log (sum (4) (5));'가 있습니다. 'console.log'는 적어도 Chrome에서 함수에 대한 toString 메소드를 호출합니다. –

+0

들여 쓰기가 도움이됩니다. –

+1

예제 코드에서 f.toString()은 결코 실행되지 않는 함수입니다. – bhspencer

답변

4

console.log()에 개체를 전달하면 값을 인쇄하기 위해 .toString()이 호출됩니다. 따라서

,

sum(4) 

함수를 반환한다. 그 함수에 대한 후속 호출

sum(4)(5) 

또한 함수를 반환합니다. 그런 다음이 console.log()에 전달, 그리고 콘솔의 결과는

9 

console API 꽤 흔들리는 준 표준 주목해야한다, 그리고 그것은 디버깅 지원으로 제작 되었기 때문에 어떤 행동이 있다고 할 수 혼란 스럽다. 이 경우에는 그러나 다른 "도움이되는"재미있는 사업없이 단순히 .toString()을 호출하는 것처럼 보입니다. 경우, 그러나, 당신은 당신이 (파이어 폭스 적어도 방화범에서) 얻을이

console.log({}) 

처럼 console.log()에 개체를 탐색 할 수있는 유용한 인터페이스를 간단하게 빈 개체를 전달할 수 있었다. 어떤 것을 디버깅하는 것이 좋지만, 언어가 어떻게 작동 하는지를 알고 싶다면 그 행동이 혼란 스러울 수 있습니다. 함수가 .valueOf() 방법을 추가하여 너무 숫자 결과를 공개 할 수 있도록 최종 참고로

가 게시 된 코드의 트릭은 연장 될 수있다 :

function sum (a) { 
    var sum = a; 

    function f (b) { 
     sum += b; 

     return f; 
    } 

    f.toString = function() { 
     return sum; 
    }; 
    f.valueOf = function() { 
     return sum; 
    }; 

    return f; 
} 

을 당신은, 당신은이 것을 얻을 경우 sum(4)(5) 실행

console.log(2 * sum(4)(5)) 
+1

그럴 경우'console.log ({})'는' [개체 개체] ". –

+1

@FelixKling 아니요, 반환 된 함수가 게시 된 코드에 명시 적으로'.toString()'메소드가 주어 졌기 때문에. * 편집 * 오, 미안해. 글쎄, 내가 답을 수정하면서 지적한 것처럼, 당신은'console.log()'를 단순하게 처리 할 수 ​​없다. – Pointy

+0

그래서 여기에서'toString' 함수는 커스텀 함수로 대체되었습니다. 그리고'console.log'는 내부적으로'toString' 함수를 호출하기 때문에이 커스텀 함수를 호출합니까? 그 맞습니까? – surajck

3

, sum(4)에서 정답 함수 f를 반환하는 먼저 실행된다.

이 함수는 JavaScript 함수 [1]의 클로저 속성으로 인해 변수 sum에 액세스 할 수 있습니다. 이 함수는 합계를 수행하고 f 함수를 다시 반환합니다.

이번에 console.logf 함수를 인쇄하려고 시도하므로 합계를 인쇄하려면 f.toString을 정의하여 함수를 인쇄하는 방법을 명시 적으로 정의하고 있습니다.

편집 : 당신은 왜 단순히 두 개의 번호를 추가 너무 많은 고통을 궁금해하는 경우 다음을 시도해보십시오 :

지금 f 다시 재귀 적으로 호출되고 sum가 업데이트되기 때문에이로 인해 작동
add(2)(1)(45)(22) 

클로저 속성.

1 : 내부 함수는 부모 함수가 범위를 벗어난 후에도 부모 함수의 변수에 액세스 할 수 있습니다.

관련 문제