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 other work
        return cbDoThing(arg);
    }
}

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

此处 getClosure1()getClosure2() 返回一个执行类似任务的闭包。 IE。它们都需要在闭包环境中执行 cbDoThing(),但 getClosure2() 还运行一些其他代码。

上面的例子不能正常工作。 cbDoThing() 是在全局上下文中定义的,因此 closed1 变量未定义。所需的行为是一种模式,使 closed1 变量可以从闭包作用域链中读取,但无需在每个闭包中重新定义 cbDoThing() 函数。

附言: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 不会从闭包变量范围访问 closed1 变量。相反,它传递了一个额外的参数。然后从每个闭包中调用此函数。

JsFiddle

最佳答案

干得漂亮。 Javascript 只沿着原型(prototype)链向下走,这意味着 cbDoThing 没有引用或声明 closed1。在这种情况下,cbDoThing 只有一个原型(prototype)——Object。如果不显式地将参数传递给 cbDoThing,它将不会有任何 closed1 的概念。

这是对 javascript 中闭包的详尽讨论:http://jibbering.com/faq/notes/closures/

关于javascript - 共享关闭代码 (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251378/

相关文章:

javascript - 循环对象属性与数字索引数组

javascript - c3js onload改变颜色

JavaScript removeAttribute 在 IE 中不适用于 href 和 onclick 值

javascript - jQuery 或 Javascript 可以模拟被点击的链接吗?

javascript - 从数组元素创建 div

javascript - 当我不更改范围内的任何内容时,AngularJS 会重新评估绑定(bind)

javascript - 单元格的动态宽度 React Native

javascript - mozilla firefox 中没有为 javascript 函数定义事件?

javascript - 是否可以/建议使用正则表达式解析我的用户输入字符串?

Javascript UNIX 时间转换