2015-10-19 74 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