2014-11-06 53 views
1

我正在寻找装饰功能。例如,装饰函数可以使sum()函数返回一个双重和。但下面的代码不能按需要工作,我将'f'改为'sum',请参阅相关行的评论,为什么我不能改变它?为什么这个javascript装饰功能不起作用?

<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

这使得没有任何意义,只是行'VAR总和= doublingDecorator(总和);'是莫名其妙的,要创建具有相同的名称作为您的可变的,覆盖整个功能和传球该功能的其他功能? – adeneo 2014-11-06 16:59:57

回答

1

两件事情:

  • 你改变了内f.applysum.apply
  • 您重新定义sum

这就是为什么它突破。您的更改使其成为永不结束的递归调用(无限递归),因为sum一遍又一遍地调用自己。这是因为你参考sum里面,你也重新定义。

最终递归结束超过最大调用堆栈大小。

我推荐保留f.apply原样。那么你的代码应该工作。另一种选择是不重新定义sum。所以这样做,而不是:

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

fdoublingDecorator不使用。相反,你参考sum,你也重新定义。这会导致无限循环。

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