2014-11-06 3 views
1

장식 기능을보고 있습니다. 예를 들어, decorate 함수는 sum() 함수를 사용하여 double sum을 반환 할 수 있습니다. 그러나 다음 코드는 원하는대로 작동하지 않습니다. 'f'를 'sum'으로 변경했습니다. 관련 행에 대한 주석을 참조하십시오. 이유는 무엇입니까?왜이 자바 스크립트 장식 기능이 작동하지 않습니다?

<script> 
function doublingDecorator(f) {   

    return function() { 

    return 2*sum.apply(this, arguments); // the original code is: return 2*f.apply(this,arguments) I changed to sum, then doesn't work. 
    } 
} 

// Usage: 

function sum(a, b) { 
    return a + b 
} 


var sum = doublingDecorator(sum);   // sum gets decoration 


alert (sum(3,4)); //return 14 
</script> 
+0

, '이해할 수없는, 당신은 전체 기능을 덮어 함수와 같은 이름의 변수를 만들고, 통과하고 다른 함수에 함수? – adeneo

답변

1

두 가지 :

  • 당신은 sum.apply에 내부 f.apply을 변경했습니다.
  • sum을 다시 정의합니다.

그것이 파괴적인 이유입니다. sum은 반복적으로 자신을 호출하기 때문에 변경하지 않으면 재귀 호출이 끝나지 않습니다 (무한 재귀). 이는 sum을 내부적으로 참조하기 때문입니다.이 또한 다시 정의했습니다.

결국 재귀는 최대 호출 스택 크기를 초과하게됩니다.

f.apply 그대로 두는 것이 좋습니다. 그러면 코드가 작동합니다. 또 다른 옵션은 sum을 다시 정의하지 않는 것입니다. 그래서 그 대신 이렇게 : doublingDecorator에서

var newSum = doublingOperator(sum); 
console.log(newSum(3, 4)); //returns 14 
3

f가 사용되지 않습니다. 대신 sum을 참조하십시오.이 또한 다시 정의합니다. 이로 인해 무한 루프가 발생합니다. 전혀 의미, 단지 라인`VAR의 합 = doublingDecorator (합)을하지 않습니다

function doublingDecorator(f) {   
    return function() { 
    return 2*f.apply(this, arguments); 
      // ^-- f instead of sum! 
    } 
} 
function sum(a, b) { 
    return a + b 
} 
var sum = doublingDecorator(sum); // note: sum is already declared here, redeclaring is technically wrong. 
console.log(sum (3,4)); // 14 
관련 문제