在jQuery 1.4中,$.noop()有什么实际用途?

49
在研究jQuery 1.4的发布说明时,我发现了$.noop(),它是:

描述:一个空函数。(添加于1.4版本)

当你想要传递一个什么也不做的函数时,可以使用这个空函数。

也许我在这里错过了什么深刻的东西,但传递一个空函数的实际用途是什么?
请提供代码示例。
9个回答

52

由于在嵌入式系统中使用$.ajax时存在性能问题,因此建议采用这个函数。这一问题已在jQuery-Dev邮件列表上报告。您可以查看线程

基本上,他们更喜欢引入并使用这个单独的空函数,而不是在各个地方声明空匿名函数。

现在,这个函数在ajaxeventoffset模块中被内部使用。

您还可以查看它被引入时的提交


20

如果你有一个接受函数作为参数的函数,但是你没有任何代码可以提供给它,你可以传递$.noop

不过在 jQuery 中我无法想到这种参数不是可选的情况。

与编写 function(){} 不同,传递 $.noop 不会创建一个新的函数实例,从而节省一点内存。然而,如果你将其传递给其他修改函数对象的函数(例如,funcParam.id = 2),那么传递 $.noop 就会破坏这些函数对象。


1
很好不需要在执行每个传递的函数参数之前检查其是否为未定义,或者在调用函数时每次都提供function(){}。 - Anthony

10

现实世界中的例子(几乎):

jQuery.fn.myAwesomeAjax = function(url, complete) {
  return jQuery.ajax(url || this.url)
    .complete(complete || jQuery.noop);
};

使用它,而不是 function() {}


4

如果某些糟糕的API要求一个函数作为参数,而你不想在其中执行任何操作,那么这就是一种通过框架支持的方式来明确表达这一点。


1
事实上,这似乎是在jQuery本身中使用的方式 - 当没有真正的回调可用时,它作为明显的占位符。 - Shog9

3

我使用了几个需要回调的插件,但是有些部分我并不想使用某个特定的回调函数。因此,我用函数() {}来代替。

noop在jQuery源代码中被定义为

noop: function() {}

因此,它可以适用于任何您使用空白函数的地方,例如上面的示例。


0
唯一的逻辑原因是,如果您调用一个执行某些操作并调用另一个函数的函数,并且您希望更高级别的函数执行其操作而不调用参数函数。
大多数jQuery函数可选地接受参数函数,因此您不必传递参数。也许有一两个例外情况 - 或者可能是为了帮助开发人员编写类似于此的自定义代码。

0
如果一个函数需要你将另一个函数作为参数传递,那么使用do_something($.noop)do_something(function(){})更短。

虽然差别不大...

...只有6个字符...

...是的,这个特性看起来相当无用。


6
它避免了引入新函数的开销。 - SLaks
1
我不会指望那个,SLaks - 查看源代码中noop的代码: noop: function() {}, - JAL
3
@Salsa: 但它总是相同的功能。在任何地方使用 $.noop(),它都是一个单一实例的单一无操作函数。我怀疑大多数 JS VM 中没有足够的开销使其产生任何明显的差异,但从理论上讲… - Shog9
2
实际上,SLaks是正确的。当加载jquery库时,分配给noop的函数只创建一次。foo(function(){})每次执行该行时都会创建一个新的函数对象。然而,没有人在意,因为与您的JS代码的其余部分相比,它所需的时间更长。 - Nicolás
好的,这是一个很好的观点。如果你想使用一个空函数,不需要每次都创建一个新的,因为已经存在一个。但我认为这不会影响调用它所产生的开销。 - JAL

0

在需要回调函数的上下文中,它纯粹是一个方便/替代function(){}的工具 - 我不认为我会很快使用它。

我敢打赌,当jQuery团队把它放进去时,他们一定笑了很久,这也有喜剧效果。


0

如果您有一个提供函数给其他函数的函数,那么它可能非常有用。

例如:您有一组数据列表。每个项目都有一个按钮执行某些操作。对于每个项目,“某些操作”可能是不同的。您有一个“FunctionFactory”,它接受项目并返回一个函数。如果由于任何原因您不希望按钮执行任何操作,则最清晰的方法可能是返回一个空函数,因为这样您就知道您的工厂始终返回一个函数。

我没有jQuery的具体示例,但我想当在.each或.map块中使用时,这可能会很方便。


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