2012-09-03 29 views
1

是否有任何方法可以在两个闭包之间共享代码?股份关闭代码(javascript)

例子:

// ANTIPATTERN 

var cbDoThing = function cbDoThing(arg){ 
    return typeof closed1 +" " + arg; 
} 

function getClosure1(closed1) { 
    return cbDoThing; 
} 

function getClosure2(closed1) { 
    return function(arg) { 
     // do other work 
     return cbDoThing(arg); 
    } 
} 

f1 = getClosure1(); 
f1("ARG1"); // returns "undefined ARG1" 
f2 = getClosure2(); 
f2("ARG2"); // returns "undefined ARG2" 

这里getClosure1()getClosure2()返回关闭,做类似的任务。即他们都需要在关闭环境中执行cbDoThing(),但getClosure2()另外运行一些其他代码。

上面的例子不像想象的那样工作。 cbDoThing()是在全局上下文中定义的,所以closed1变量未定义。想要的行为是一种模式,可以从闭合范围链中读取closed1变量,但不需要在每个闭包中重新定义函数cbDoThing()

PS:JsFiddle playground

编辑: 现在,我问,一个答案来找我稍作修改:

var cbDoThing = function cbDoThing(closed1, arg){ 
    return closed1 +" " + arg; 
} 

function getClosure1(closed1) { 
    return function(arg) { 
     return cbDoThing(closed1, arg);    
    } 
} 

function getClosure2(closed1) { 
    return function(arg) { 
     // do other work 
     return cbDoThing(closed1, arg); 
    } 
} 

的cbDoThing不从封闭的可变范围内访问封式变量。而是通过一个额外的论据。然后从每个闭包中调用该函数。

JsFiddle

+0

这就是它(因为这是没有办法让从主叫封闭的封式)! – devundef

回答

2

不错的工作。 Javascript只是沿着原型链走,这意味着cbDoThing没有引用或声明closed1。在这种情况下,cbDoThing只有一个原型 - 对象。如果不明确地将参数传递给cbDoThing,它将不会有任何closed1的概念。

这里是关闭的JavaScript中进行深入讨论:http://jibbering.com/faq/notes/closures/