首页 > 解决方案 > 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();

我在其他一些代码中有一个与此类似的循环。我根本无法弄清楚如何在这段代码中使长度变量成为本地变量。我不能将它传递给函数,因为它会调用自己。我不能真正将它移动到任何地方,因为循环总是把事情搞砸。

感谢您的任何帮助!

标签: javascriptloopsglobal-variables

解决方案


我假设您想在循环的连续函数调用之间保持长度值。你可以通过返回一个使用长度的闭包来做到这一点。因此,您可以执行以下操作,而不是像当前那样定义循环:

const loop = (function() {
    var length = 0;
    return function (array, func) {
        // Your current code for loop here
    }
}) ();

基本上,它的作用是将循环分配为从另一个匿名函数调用返回的函数。这确保了长度的值保持不变,因为它是在最终分配给循环的函数范围之外定义的,但在代码的其他任何地方都完全不可访问。


推荐阅读