JSLint的 - 不要在一个循环中做功能

问题描述 投票:5回答:3

参照这个话题:qazxsw POI

你将如何处理一个jQuery。每个(函数(){...}在for循环内?知道我需要的“为”我“的每个”功能的上下文。相信每一个需要的参数,以一个我可以映射功能循环之外,但是从我的角度来看,它影响了可读性声明的函数。

有什么想法吗?

提前致谢。

javascript jslint
3个回答
9
投票

嗯,你可以保留的情况下在你的循环,因为一切都在为实际上是在相同的上下文中在开始声明的函数。

因此,让我们弗里茨的例子,但首先让我们这充分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的不会(也不应该)抱怨indexs(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结构不会创建一个新的闭包。这可能是担心你。没问题!


4
投票

在循环功能的问题是:这个,

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

    });
}

2
投票

它已经听起来像问题更与警告不是与你的代码。是啊,它会是不错的通过JSLint的测试,而不警告,但他们中的一些可能是不合理而造成不必要的代码重构(refactorization)。

在这个Q&A的讨论是相关的:var my_func; for(..) { my_func = function () { // .. } $("..").each(my_func); } 其他皮棉工具都可以比的JSLint更大的灵活性,因此您可以继续高效地使用您的个人喜好的编码,不一定Crockford的个人编码偏好。

我建议你考虑使用其他工具来皮棉您的JavaScript和不牺牲你的代码的可读性,可维护性或。

© www.soinside.com 2019 - 2024. All rights reserved.