Javascript:避免在涉及大量循环的代码中使用全局变量

时间:2018-06-21 02:10:51

标签: javascript loops global-variables

我遇到一个非常混乱的问题。我认为最好用代码来解释:

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();

在其他一些代码中,我有一个与此类似的循环。我根本无法弄清楚如何在此代码中使length变量成为局部变量。我无法将其传递给函数,因为它会自行调用。我真的无法将其移动到任何地方,因为循环会使事情变得混乱。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我假设您要保持循环的连续函数调用之间的length值。您可以通过返回使用该长度的闭包来实现。因此,可以像现在这样定义循环,而不必这样做:

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

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

答案 1 :(得分:1)

不确定确切地您将要完成的所有工作,但看起来mainloop的调用者,因此您可以拥有{{1 }}是length的参数,并以初始loop为0的情况main调用loop并让length和回调返回修改后的{{1 }}:

loop

答案 2 :(得分:1)

Keveloper's answer对您来说是个好主意。我建议您先尝试这种方式。

这是避免全局变量的另一种方法,它也可能起作用。

function loop(array, func, data) {
	for (var i = 0; i < array.length; i++) {
		array[i].func(data.length);
		data.length += array[i].number;
		if (func) {
			func(data);
		}
	}
}

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 (data) {
		loop(array, null, data);
	}, { length: 0 });
}

main();

您可以将长度作为参数loop传递。但不是直接使用对象来包装它,因此它由 reference 传递。