共享关闭代码(javascript)

共享关闭代码(javascript),javascript,Javascript,有没有办法在两个闭包之间共享代码 例如: // ANTIPATTERN var cbDoThing = function cbDoThing(arg){ return typeof closed1 +" " + arg; } function getClosure1(closed1) { return cbDoThing; } function getClosure2(closed1) { return function(arg) { // do o

有没有办法在两个闭包之间共享代码

例如:

// 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()
返回执行类似任务的闭包。也就是说,它们都需要在闭包环境中执行
cbothing()
,但是
getClosure2()
还运行一些其他代码

上面的示例并没有按预期的那样工作
cbothing()
是在全局上下文中定义的,因此closed1变量是未定义的。想要的行为是一种模式,可以从闭包作用域链读取closed1变量,但不必在每个闭包中重新定义
cbothing()
函数

PS:

编辑: 既然我问了,我得到了一个稍加修改的答案:

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);
    }
}
CBbothing不从closure变量范围访问closed1变量。而是通过了一个额外的论点。然后从每个闭包调用此函数


干得好。Javascript只沿着原型链走,这意味着cbDoThing没有closed1的引用或声明。在这种情况下,CBbothing只有一个原型-对象。若不显式地将参数传递给CBothing,它就不会有closed1的任何概念

下面是对javascript中闭包的详细讨论:

就是这样(因为这不是从调用方闭包获得closed1的方法)!