$.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 存储