2014-11-06 52 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