2014-11-17 2 views
3

나는 최근에 JS를 배우기 시작했으며 이것은 기능 언어 영역으로의 첫 번째 다이빙입니다."트램펄린"방법의 차이점

functional-javascript-workshop npm 모듈에서 "트램펄린"운동을하고 있었고 내 솔루션과 공식 솔루션의 흥미로운 차이점을 발견했습니다. 둘 다 완벽하게 잘 작동하지만, 나는 그들 사이의 실제적인 차이가 정확히 무엇인지에 관해서는 손해보고 있습니다. 나는 내 자신의 솔루션을 잘 이해하고 있지만 왜 다른 솔루션이 효과가 있는지 정확히 이해하지는 못한다.

내 솔루션

function repeat(op, num) { 
    var _repeat = function() { 
    if (num <= 0) return; 
    op(); 
    return repeat(op, --num); 
    }; 

    return _repeat; 
} 

function trampoline(f) { 
    while (f instanceof Function) { 
    f = f(); 
    } 
    return f; 
} 

module.exports = function(op, num) { 
    return trampoline(repeat(op, num)); 
}; 

공식 솔루션

function repeat(operation, num) { 
    return function() { 
    if (num <= 0) return 
    operation() 
    return repeat(operation, --num) 
    } 
} 

function trampoline(fn) { 
    while(fn && typeof fn === 'function') { 
    fn = fn() 
    } 
} 

module.exports = function(operation, num) { 
    trampoline(function() { 
    return repeat(operation, num) 
    }) 
} 

은 특히, 내가 마지막 부분에 대해 궁금 해요 - 왜 공식 솔루션은 annonymous 함수를 만들 않는 대신 단지 통과 repeat? 그것은 한 fn이 함수가 호출 그대로 반복하는 유지하는 방법

function trampoline(fn) { 
     while(fn && typeof fn === 'function') { 
     fn = fn() 
     } 
    } 

주의 사항 :

+0

코드에 차이가 있다고 생각하지 않습니다. 공식 솔루션에서 trampoline이 함수와 함께 호출된다는 것을 즉시 알 수 있습니다. 솔루션에서 반환하는 항목을 확인해야합니다. . 그리고 사이드 노트에서 javascript의 세미콜론을 피하는 것이이 공식적인 해결책에 조심해야합니다. "잘 모르겠다"라는 것을 모르는 경우 추악해질 수 있습니다. –

+0

Hey Joel - 질문이 있습니다. 나는이 운동에 매달렸다. "fn && typeof fn ==="function "이 항상 사실이 아닐 때를 알 수 없습니다. 약간 혼란 스럽습니다. –

답변

1

는 트램 폴린을 살펴보십시오.

그래서 이론적으로는 많은 중첩 된 기능을 가지고 같은 결과를 얻을 수 있습니다

module.exports = function(operation, num) { 
    trampoline(function() { 
    return function() { 
     return function() { 
      return repeat(operation, num); 
     }; 
    }; 
    }); 
}; 

데모 : http://jsbin.com/yixaliyoye/1/edit

공식 솔루션은 솔루션보다 1 중복 단계가 있습니다. 원작자가 아닌 다른 사람들이 아마 더 쉽게 읽을 수 있다고 생각했을 것입니다.

1

정말 이유가 없습니다.

trampoline이 의 모든 전화 번호을 호출하는 것을 제외하고 귀하의 버전에서 repeat의 첫 번째 호출은 그 외부에서 이루어집니다. 이는 더 깨끗한 것으로 간주 될 수 있으며 trampoline이 더 복잡한 경우 (예 : try-catch에서 모든 실행을 래핑) 실제적인 차이를 만들 수 있습니다.