参考这个主题:不要在循环中创建函数。- jslint 错误
您将如何处理 for 循环中的 jquery .each(function () {...}?知道我需要“每个”函数中“for”的上下文。当然,我可以将每个所需的参数映射到function 在循环之外声明的函数,但从我的角度来看,它会影响可读性。
有什么想法吗?
提前致谢。
参考这个主题:不要在循环中创建函数。- jslint 错误
您将如何处理 for 循环中的 jquery .each(function () {...}?知道我需要“每个”函数中“for”的上下文。当然,我可以将每个所需的参数映射到function 在循环之外声明的函数,但从我的角度来看,它会影响可读性。
有什么想法吗?
提前致谢。
好吧,您可以在循环中保留 for 的上下文,因为 for 中的所有内容实际上与开始时声明的函数处于相同的上下文中。
所以让我们以 Frits 的例子为例,但首先让我们先让这个 JSLint 完全快乐(减去循环错误中调用的函数)。
/*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
函数。这不酷!为什么一遍又一遍地重新声明相同的功能?
提前声明它,像这样:
/*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);
}
成功。现在您不必为每次迭代创建一个函数。而且,由于 JSLint 通过将所有声明推到顶部来帮助您实现var
,您仍然可以获得相同的上下文。
编辑:正如@Flame 指出的那样,您不必使用 jQuery 提前声明函数each
并且可以使用匿名函数,但提前声明并不是一个坏主意,特别是如果您要在多个each
调用中重用逻辑. 主要的收获是理解 1.) 早期声明实践仍然有优势,并且 2.) jQuery 仍然会向您的函数发送参数(这里是我们所调用的index
),尽管 JSLint不会(并且不应该)抱怨each
s 中使用的匿名函数(这里是 jQuery 酱)。
如果您习惯了匿名$.each(function() {});
构造,它最初会有点不直观,但它同样简单。
/*global alert, $ */
$( "li" ).each(function( index ) {
alert( index + ": " + $(this).text() );
});
... 变成...
/*global $, alert */
var fnOutside = function(index) {
alert( index + ": " + $(this).text() );
};
$( "li" ).each(fnOutside);
这可能会造成短暂的混淆,因为函数调用没有参数,但 jQuery 将“索引”参数推送到函数。arguments
如果您想省略命名,您可以抓取上下文数组以查看它仍然被推入其中。
也就是说,for
构造不会创建新的闭包。这可能让你担心。没问题!
循环中的函数的问题是:this,
for (var i = 0; i < list.length; i+= 1) {
function my_func(i) {
console.log(i);
}
my_func(i);
}
将被解释为:
var my_func;
for (var i = 0; i < list.length; i+= 1) {
my_func = function (i) {
console.log(i);
}
my_func(i);
}
因为可变提升。所有声明都将移到范围的顶部(即函数)。因此,在 for 循环中定义函数实际上没有意义。
如果您想在 for 循环中绑定到计数器,只需关闭即可。
只是要清楚:
$("..").each(function () {
for(..) {
}
});
很好。
for(..) {
$("..").each(function () {
});
}
不好,因为它相当于:
var my_func;
for(..) {
my_func = function () {
// ..
}
$("..").each(my_func);
}
听起来问题更多的是警告而不是您的代码。是的,在没有警告的情况下通过 JSLint 测试会很好,但其中一些可能是不合理的,并导致不必要的代码重构。
此问答中的讨论是相关的:我应该使用 JSLint 还是 JSHint JavaScript 验证?其他 lint 工具比 JSLint 更灵活,因此您可以继续使用您的个人编码偏好,而不一定是 Crockford 的个人编码偏好。
我建议您考虑使用其他工具来检查您的 JavaScript,并且不要牺牲代码的可读性或可维护性。