jQuery | 函数内部是否应该嵌套函数?这是一种不好的实践吗?

3

我使用这个函数是为了方便,因为我将经常使用fadeTo:

function fade_to(div, speed, opacity, after_fade) {
    $(div).fadeTo(speed, opacity, after_fade);
}

然后我将同样的函数用于 after_fade 参数:
fade_to('#div', 3000, 1, function() { fade_to('#another_div', 3000, 1)});

这样做有什么不好吗?会出现速度/流畅性问题吗? 还是直接使用jQuery的默认fadeTo函数更好?

谢谢!


似乎有点毫无意义。 - nodrog
2
没有任何问题,性能也不会受到影响,但我看不出有什么好处。如果您跳过一些始终相同的参数,或者使用$('#' + div)并只传递元素的ID,则可以使其更有益。 - ericosg
我看不出你的包装函数有什么优势。你只是增加了一层抽象,会让下一个维护代码的人感到困惑。如果你的函数没有以某种方式扩展本地库调用,那么你应该坚持使用本地库调用。 - Dan A.
感谢大家的回答!你们确实帮了我一把。 - m.spyratos
这可能只有在速度和不透明度相同时才有用,所以我只需要输入div的id。这不是一个很大的项目,我将是唯一的工作人员,所以我只想更快地运行事情。再次感谢您的支持,ericosg、dan、thomasdotnet、fresheyeball、namphibian、sacredfaith... - m.spyratos
6个回答

5

你的方法没有任何优势。而且你使用了 jQuery 的 fadeTo 函数。你所做的没有问题,只是没有优势。如果你的自定义函数有较少的参数,这种技术可以节省工作:

function fade_to(div, after_fade) {
    $(div).fadeTo(3000, 1, after_fade);
}

fade_to('#div', function(){ fade_to('#another_div', $.noop); });

这实际上可以通过防止您输入速度和不透明度参数来节省工作。您还可以像这样进行加糖处理。

function Fade_to(speed, opacity){
     return function(div, callback){
           $(div).fadeTo(speed, opacity, callback);
     }
}

然后,您可以即时创建参数保存功能,如下所示:
var fade_to_foo = Fade_to(3000, 1);
fade_to_foo('#div', function(){ fade_to_foo('#another_div'); });

否则,没有理由不按照jQuery的方式编写它。
$('#div').fadeTo(3000, 1, function(){ $('#another_div').fadeTo(3000, 1); });

+1 我喜欢这个答案,除了我会让函数为一些或所有参数设置默认值。这可能需要一些鸭子类型,但可以真正减少代码量。例如,我会将 $.noop 放在函数中,并执行类似于 after_fade || $.noop 的操作。 - user1106925
啊,我看到你更新了一个柯里化的例子。那是另一个好主意。 - user1106925
很好地使用了柯里化。这点加一。 - Florian Margaine

5

这是一个不好的实践,因为你不能再使用任何修饰符而不将它们应用于每个调用函数的实例。由于你可以在jQuery中链接修饰符,并且大多数人都认为这样做是一个有用的功能,所以你正在禁用自己或其他人在此代码体上工作时的有用功能。

如果你想要添加任何额外的动画或样式,你将不得不通过常规的jQuery重新选择对象。额外的工作、额外的调用,没有真正的好处。


一个 return 语句就可以解决这个问题。 - user1106925

1

你的方法很方便。我怀疑它是否会减缓淡出效果。在我看来,这种方法没有什么问题。如果你决定淡出效果在消失之前应该跳动或闪烁,那么你只需要修改你的函数以进行跳动/闪烁,并淡出所有调用淡出的新例程都将运行。在这种情况下,这是有意义的,因为它可以减少代码并提高可维护性。不过,Ericosg确实有一个有效的观点,为什么不减少参数如果它们将是相同的。


1

这种做法违背了使用jQuery作为可链式、简短语法库的目标。然而,如果这个特定的功能对于一个项目有用,它可以是有效的。


1

Mike,

我不知道这是否是一种“不好”的做法,因为它可能提供了更容易使用的功能或其他什么东西(考虑到我不知道您的示例的上下文),而标准 API 中给出的函数则没有。

实际上,函数调用自身是使用计算机科学中的一种叫做“递归”的思想,可以用于遍历树(您可以谷歌递归和树来更好地理解我的意思),或执行某种数学操作(即欧几里得算法)。

我要说的是,如果你这样做,最好问一下自己“为什么”。由于你多传递了一次参数,而且你的函数与 API 实现相比并没有完成额外的工作(至少我所看到的情况如此),所以你不会获得任何速度方面的优势。如果你养成了这种习惯……比如说用更耗费计算资源的函数……你可能会注意到速度变慢。

我希望不仅在这里回答你的问题,还能为你提供一些进一步的见解,以说明为什么通常这样做是一个不好的主意。我同意dunsmoreb和Thomasdotnet的观点。好观点!

-sf


1

最好只使用jQuery的默认 fadeTo 函数。就这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接