参照这个话题:qazxsw POI
你将如何处理一个jQuery。每个(函数(){...}在for循环内?知道我需要的“为”我“的每个”功能的上下文。相信每一个需要的参数,以一个我可以映射功能循环之外,但是从我的角度来看,它影响了可读性声明的函数。
有什么想法吗?
提前致谢。
嗯,你可以保留的情况下在你的循环,因为一切都在为实际上是在相同的上下文中在开始声明的函数。
因此,让我们弗里茨的例子,但首先让我们这充分JSLint的快乐至上(减去称为环路误差函数)。
Don't make functions within a loop. - jslint error
注意,每次迭代循环时,你重新声明的/*global console*/
var my_func, i, list;
for (i = 0; i < list.length; i+= 1) {
my_func = function (i) {
console.log(i);
};
my_func(i);
}
功能。那不是爽!为什么要一遍又一遍地重复声明相同的功能?
早些时候,这样的声明是:
my_func
成功。现在,你不必创建每个迭代的功能。而且,正如JSLint的帮助你推你的所有/*global console*/
var my_func, i, list;
my_func = function (i) {
console.log(i);
};
for (i = 0; i < list.length; i+= 1) {
my_func(i);
}
声明顶端实现,你仍然可以有相同的背景。
编辑:作为var
,你不必提前与jQuery @Flame points out声明函数,可以使用匿名函数,但它不是一个坏主意,早申报,特别是如果你正在做的重用在多个each
调用的逻辑。主要采取家园都明白,1)早期的声明还是实践方面具有优势,和2)jQuery的仍然会沿着参数发送给你的函数(在这里,我们调用什么each
),尽管JSLint的不会(也不应该)抱怨index
s(each
使用匿名函数)。
它最初是有点更直观的,如果你已经习惯了匿名jQuery sauce here结构,但它很容易。
$.each(function() {});
... 变成...
/*global alert, $ */
$( "li" ).each(function( index ) {
alert( index + ": " + $(this).text() );
});
这可能会造成混淆,因为简单的函数调用没有参数,但jQuery是什么推动了“指数”参数的功能。你可以只抢上下文/*global $, alert */
var fnOutside = function(index) {
alert( index + ": " + $(this).text() );
};
$( "li" ).each(fnOutside);
阵列地看到,它仍然在那里推,如果你想离开命名的。
arguments
也就是说,在Fiddle-ige结构不会创建一个新的闭包。这可能是担心你。没问题!
在循环功能的问题是:这个,
for
将被解释为:
for (var i = 0; i < list.length; i+= 1) {
function my_func(i) {
console.log(i);
}
my_func(i);
}
由于可变悬挂。所有声明将被移动到的范围(即功能)的顶部。所以它实际上没有任何意义的for循环定义一个函数。
如果你想绑定到一个for循环计数器简单地作出关闭。
只要是明确的:
var my_func;
for (var i = 0; i < list.length; i+= 1) {
my_func = function (i) {
console.log(i);
}
my_func(i);
}
是罚款。
$("..").each(function () {
for(..) {
}
});
是不是很好,因为它是等价于:
for(..) {
$("..").each(function () {
});
}
它已经听起来像问题更与警告不是与你的代码。是啊,它会是不错的通过JSLint的测试,而不警告,但他们中的一些可能是不合理而造成不必要的代码重构(refactorization)。
在这个Q&A的讨论是相关的:var my_func;
for(..) {
my_func = function () {
// ..
}
$("..").each(my_func);
}
其他皮棉工具都可以比的JSLint更大的灵活性,因此您可以继续高效地使用您的个人喜好的编码,不一定Crockford的个人编码偏好。
我建议你考虑使用其他工具来皮棉您的JavaScript和不牺牲你的代码的可读性,可维护性或。