javascript - 闭包中局部变量的错误行为

标签 javascript closures

我卡在了下面的代码中。首先,我将描述用例:使用 ColorGradient 的实例调用函数“addPreset”。当调用 this.listController.addItem(...) 时,会提供一个名为 onSelect 的回调函数,每次触发 listController 项目上的 onSelect 事件时都会调用该回调函数。我想做的是将对 GLab.ColorSlider.applyColorGradient(...) 的调用包装到一个新的闭包中,以便为 addPreset 的“cg”参数赋值* 将被“捕获”在其中。但它不起作用。

问题:现在每次调用 addPreset 时,cg 的值(通过调用传递)将覆盖之前分配的所有值。但是,this.presetList 始终保持正确的值(我希望在闭包函数中捕获的那些值。即使插入一个匿名函数来打破作用域也无济于事。

请帮帮我。 :-)

谢谢,到目前为止

function addPreset(cg) {
    if (!(cg instanceof ColorGradient)) {
        throw new TypeError("PresetManager: Cannot add preset; invalid arguments received");
    }

    var newIndex = this.listController.addItem(cg.getName(), {
        onSelect: (function(cg2) {
            return function() {
                // addPreset's scope should now be broken
                GLab.ColorSlider.applyColorGradient(cg2);
                console.log(cg2);
            }
        })(cg)
    });

    this.presetList[newIndex] = cg;
}

@bobince:当然可以。

上面的代码片段是 PresetManager.js 的一部分,listController 是类 ListWrapper.js

的一个实例

http://code.assembla.com/kpg/subversion/nodes/GradientLab/lib-js/PresetManager.js http://code.assembla.com/kpg/subversion/nodes/GradientLab/lib-js/ListWrapper.js

@Matt: cg 是 ColorGradient 的实例。 我自己的自定义类。此外,可以确保始终“有效”值作为 cg 传入。 (当你有几分钟的时间时,你可以将整个 assembla repo 下载为 zip-archive。在 FF > 3.5 中解压并在启用 Firebug 控制台的情况下进行测试。)

最佳答案

可以在这个问题中找到答案:Doesn't JavaScript support closures with local variables?

关于javascript - 闭包中局部变量的错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466097/

相关文章:

javascript - 如何将换行符/回车符插入到 element.textContent 中?

javascript - JQuery 中的跨站点 HTTP 身份验证

javascript - JavaScript 中何时以及如何调用此函数?

Java "Closures"本地类和匿名类之间的比较

javascript - Office 加载项 : Cannot clean Word document after inserting ooxml (Office Online, 适用于桌面)

javascript - D3 检索矩形顶点以附加平行四边形(多边形)

javascript - 如何将 Node 变量传递给外部javascript?

javascript - 是否有另一种方法可以通过 innerHTML 按钮的 onclick 而不是绑定(bind)到窗口来调用本地函数?

Groovy:如何获取 ?private? 的值闭包变量

javascript - JS Closure - 依赖于回调的多个日期选择器初始化/调用