【问题标题】:how could I pass closure problems in order to increment a global var我如何通过闭包问题来增加全局变量
【发布时间】:2013-06-24 16:46:45
【问题描述】:

我有一个简单的目标,我想增加一个变量,但我面临着闭包问题。我已经读过为什么会在这里发生这种情况How do JavaScript closures work?

但我找不到解决问题的方法:/

让我们假设这部分代码是我从链接中获取的。

function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num); //incrementation
}
num++;
return sayAlert;
}

我想在函数中增加 num 并保留对 num 的更改。

我该怎么做?

这是我遇到问题的 JsFiddle,我不知道如何增加我的 totalSize 并保留它。

http://jsfiddle.net/knLbv/2/

我不想要一个以闭包结尾的局部变量。

【问题讨论】:

  • 那么问题出在哪里?你需要达到什么目标? say667()() 将始终提醒 667,正如函数名称所假定的那样。如果您希望返回的函数每次都提示递增值,则应将 num++ 移动到 sayAlert 的主体内。
  • 如果你想访问 global 变量,那么不要在你的函数中使用同名的 local 变量。
  • 同意@Tommi。您应该发布此功能的使用示例和预期结果,以便我们了解您想要实现的目标
  • 我编辑了主帖,这涉及 nodejs 和 mongoose 以及我在 Steam 上流行的一些 xml,但它是 javascript,我正在努力解决它:/ 我应该创建一个新帖子吗?

标签: javascript asynchronous closures


【解决方案1】:

从你的小提琴来看,我猜问题是关闭(totalSize 应该在循环之外)和query.exec 是异步的(这个可以用一些console.log 来验证)。

您似乎需要某种控制流,例如async.reduce

【讨论】:

  • 嘿,感谢您的回答,我正在尝试获取包含大量信息的 xml,例如用户玩过的游戏。对于每个游戏,我都在尝试验证游戏是否存在于我的 mongoDB 中,以便获取他的大小并将其添加到全局变量中。我不知道我是否需要像 socket.io/backbone 这样的另一个库,因为我真的不知道它们的用途。我会调查你的控制流程。
  • 我没有使用 async.reduc 但问题来自 query.exec 的异步特性 :)
【解决方案2】:
function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num++); //incrementation
}
return sayAlert;
}

var inscrese = say667();

所以如果你想加一,只需拨打increase();

【讨论】:

    【解决方案3】:

    如果所有其他解决方案都失败,则将 num 设为数组:var num = [666],然后递增它的第一个元素:num[0]++

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多