$.noop() 在 jQuery 1.4 中的真正用途是啥?

Posted

技术标签:

【中文标题】$.noop() 在 jQuery 1.4 中的真正用途是啥?【英文标题】:What real purpose does $.noop() serve in jQuery 1.4?$.noop() 在 jQuery 1.4 中的真正用途是什么? 【发布时间】:2011-01-05 09:01:07 【问题描述】:

翻阅关于 jQuery 1.4 的发行说明,我发现$.noop() 是:

描述:一个空函数。 (在 1.4 中添加)

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

也许我在这里遗漏了一些深刻的东西,但是传递一个空函数到底有什么实际用途?

感谢代码示例。

【问题讨论】:

【参考方案1】:

这个函数是由于嵌入式系统在使用$.ajax时的性能问题而提出的,在jQuery-Dev邮件列表中报告。你可以看到thread。

基本上,他们更喜欢引入和使用这个单一的空函数,而不是到处声明空的匿名函数。

现在这个函数在ajax、event和offset模块内部使用。

你也可以看看commit的介绍。

【讨论】:

【参考方案2】:

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

不过,我想不出在 jQuery 中参数一开始就不是可选的任何此类情况。

与写function()不同,传递$.noop不会创建新的函数实例,节省一点内存。但是,如果您传递它来修改函数对象(例如,funcParam.id = 2),则传递 $.noop 会搞砸。

【讨论】:

在执行之前不必检查每个传递的函数参数是否未定义,或者在调用函数时,每次都必须提供 function(),这很好。【参考方案3】:

真实世界的例子(差不多):

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

用它代替function ()

【讨论】:

【参考方案4】:

如果一些糟糕的 API 需要一个函数作为参数,而您不想在其中做任何事情,那么这将是一种框架支持的方式来使这一点变得显而易见。

【讨论】:

确实,这就是它在 jQuery 本身中的使用方式——当没有真正的回调可用时,它是一个明显的占位符。【参考方案5】:

我使用了几个需要回调的插件,但对于某些部分,我实际上并不想使用某个回调。所以,我输入了 function() 。

noop 在 jQuery 源代码中定义为

noop: function() 

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

【讨论】:

【参考方案6】:

唯一合乎逻辑的原因是,如果您调用的函数执行某项操作并调用另一个函数,并且您希望更高级别的函数执行其操作而不调用参数函数。

大多数 jQuery 函数都可以选择使用参数函数,因此您不必传入一个。也许有一两个不是这种情况——或者它可能是为了帮助开发人员使用他们的自定义代码,其行为类似于这个。

【讨论】:

【参考方案7】:

如果一个函数需要你传递一个函数作为参数呢? do_something($.noop)do_something(function()) 更短。

虽然不是很多...

...6 个字符...

...是的,这个功能实际上看起来很没用。

【讨论】:

它避免了新函数的开销。 我不会指望这一点,SLaks - 查看源代码中的 noop 代码:noop: function() , @Salsa:但它总是相同的功能。到处使用 $.noop() ,它是相同的,单个无操作函数的单个实例。我怀疑大多数 JS 虚拟机是否有足够的开销来产生任何明显的差异,但理论上...... 其实 SLaks 是对的。分配给noop 的函数在加载jquery 库时创建一次。 foo(function()) 每次执行该行时都会创建一个新的函数对象。然而,没人关心,因为相比之下,你的 JS 代码的其余部分会花费更多时间。 好的,这很好。如果您想使用一个空函数,则无需每次都创建一个新函数,因为已经存在一个。我想它不会影响调用它的任何开销。【参考方案8】:

如果你有一个函数可以为其他函数提供函数,它会很有用。

示例:您有一个数据列表。每个项目都有一个做某事的按钮。每个项目的“某物”可能不同。您有一个“FunctionFactory”,它接收项目并返回一个函数。如果您出于某种原因不希望按钮执行某项操作,那么最简洁的方法可能是返回一个空函数,因为这样您就知道您的工厂总是返回一个函数。

我没有 jQuery 的具体示例,但我想这在 .each 或 .map 块中使用时会派上用场。

【讨论】:

【参考方案9】:

在需要回调的情况下,这纯粹是 function() 的方便/替代 - 我认为我不会很快使用它。

我敢打赌,当 jQuery 团队把它放进去的时候,他们笑得很开心,这也有喜剧目的。

【讨论】:

以上是关于$.noop() 在 jQuery 1.4 中的真正用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 redux-persist 创建同步存储失败。回退到 React.js 中的 noop 存储

我的 OpenCL 代码根据看似 noop 更改输出

Objective-C 的 [noop:] 函数在哪里定义?

在 PostgreSQL 中使用啥作为 NOOP?

简单的 C# Noop 语句

Shell 中的真与假