2015-10-19 78 views
0

在裝飾器模式中,原始函數可能會重新定義爲:original = wrapper(original)。爲什麼wrapper2在下面的例子中使用原始的aa函數(a + b),如果在(a + b + 12)之前已經被wrapper函數重新定義了?在JavaScript中由裝飾器重新定義原始函數值

function aa(a, b) { 
 
    return a + b 
 
} 
 
console.log(aa)  //function aa(a,b) {return a+b} 
 
console.log(aa(1, 2)) //3 
 

 

 
function wrapper(fn) { 
 
    return function() { 
 
    return arguments[0] + arguments[1] + 12 
 
    } 
 
} 
 
aa = wrapper(aa) 
 
console.log(aa)  //function(){return arguments[0]+arguments[1]+12} 
 
console.log(aa(1, 2)) //15 
 

 

 
function wrapper2(fn) { 
 
    return function() { 
 
    return arguments[0] + arguments[1] + 120 
 
    } 
 
} 
 
aa = wrapper2(aa) 
 
console.log(aa)  //function(){return arguments[0]+arguments[1]+120} 
 
console.log(aa(1, 2)) //123

+0

它包裹的120,而不是12將是很好,如果你可以只在第三值咖喱,而不是硬編碼... – dandavis

+2

你從來不會使用'fn',所以你的arent真正包裝了以前的'aa'功能。你所做的只是定義一個函數,該函數將返回一個函數,該函數將添加前兩個參數並添加第三個硬編碼值。 –

回答

0

不使用FN可言。 試試這個:

function wrapper(fn) { 
    return function() { 
    return (fn(arguments[0], arguments[1]) + 12); 
    } 
} 
+1

謝謝!我認爲你的代碼中有一個額外的括號。 –

+0

謝謝維克多,我在左邊又增加了一個! – pietro909