javascript - Javascript:避免在涉及大量循环的代码中使用全局变量
问题描述
我有一个非常令人困惑的问题。我认为最好用代码来解释:
var length = 0; // I want to avoid this variable being global
function loop(array, func) {
for (var i = 0; i < array.length; i++) {
array[i].func(length);
length += array[i].number;
if (func) {
func();
}
}
}
function bar(number) {
this.func = function(len) {
console.log(len);
};
this.number = number;
}
function main() {
var array = [];
for (var j = 1; j < 3; j++) {
var foo = new bar(j);
array.push(foo);
}
loop(array, function() {
loop(array);
});
}
main();
我在其他一些代码中有一个与此类似的循环。我根本无法弄清楚如何在这段代码中使长度变量成为本地变量。我不能将它传递给函数,因为它会调用自己。我不能真正将它移动到任何地方,因为循环总是把事情搞砸。
感谢您的任何帮助!
解决方案
我假设您想在循环的连续函数调用之间保持长度值。你可以通过返回一个使用长度的闭包来做到这一点。因此,您可以执行以下操作,而不是像当前那样定义循环:
const loop = (function() {
var length = 0;
return function (array, func) {
// Your current code for loop here
}
}) ();
基本上,它的作用是将循环分配为从另一个匿名函数调用返回的函数。这确保了长度的值保持不变,因为它是在最终分配给循环的函数范围之外定义的,但在代码的其他任何地方都完全不可访问。
推荐阅读
- android - 如何使用类似于谷歌照片的自定义可绘制添加回收器视图快速滚动器?
- jenkins - Jenkins 脚本化管道嵌套环境变量
- vue.js - vue-router :为什么在以前的查询用相同的值重写时监视 $route 触发器
- apache - https 配置后的 ERR_TIMED_OUT
- redis - 如何在 redis 中执行派生或计算属性(又名聚合)?
- python-3.x - MRP WORKORDER 平板电脑 ODOO 13
- java - Spring Data REST 控制器不得在类级别上使用 @RequestMapping,因为这会导致 Spring MVC 的双重注册
- ejbca - 将 EJBCA 安装为 CA
- sql - 选择某些列相同但其他列不同的行
- macos - 无法打开rabbitmq localhost UI