gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:54:07 24 4
gpt4 key购买 nike

我卡在了下面的代码中。首先,我将描述用例:使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com