【问题标题】:JavaScript / jQuery closure function syntaxJavaScript / jQuery 闭包函数语法
【发布时间】:2011-05-27 05:31:41
【问题描述】:

谁能解释一下以下函数的区别:

(function($){
  // can do something like 
  $.fn.function_name = function(x){};

})(jQuery);

我可以在下一个函数中使用 jQuery 吗?

(function(){

}());

下面的和jquery.ready()一样吗?

$(function(){

});

谢谢!

【问题讨论】:

标签: javascript jquery


【解决方案1】:

(function($){
  // can do something like 
  $.fn.function_name = function(x){};

})(jQuery);

这是在参数中使用$ 的自执行匿名函数,因此您可以在该函数中使用它($)而不是jQuery,并且不必担心与其他库发生冲突,因为在其他库中也是如此$ 有特殊含义。这种模式在编写 jQuery 插件时特别有用。

你也可以在那里写任何字符而不是$

(function(j){
  // can do something like 
  j.fn.function_name = function(x){};

})(jQuery);

这里j 会自动追上jQuery 末尾指定的(jQuery)。或者你可以完全忽略这个论点,但是你将不得不使用 jQuery 关键字而不是 $ ,而且仍然不用担心碰撞。所以$ 被包裹在速记的参数中,这样你就可以在该函数的周围写$ 而不是jQuery


(function(){

}());

这又是一个自动执行的匿名函数,但没有参数并且运行/调用自己,因为最后是()

事实证明,这种模式在某些情况下非常有用。例如,假设您想每次运行 500 毫秒后运行一段代码,您自然会选择setInterval

setInterval(doStuff, 500);

但是如果doStuff 函数需要超过 500 毫秒才能完成它正在做的事情呢?您会看到意想不到的结果,但setInterval 将在指定时间一次又一次地调用该函数,而不管doStuff 是否完成。

这就是该模式的用武之地,您可以将 setTimeout 与自执行匿名函数结合使用,并避免 bad setInterval 像这样:

(function foo(){
   doStuff;

   setTimeout(foo, 500);

})()

这段代码也会一次又一次地重复,但有一点不同。 setTimeout 永远不会被触发,除非 doStuff 完成。比使用糟糕的setInterval 更好的方法。

You can test it here.

请注意,您也可以像这样编写自执行匿名函数:

function(){
  // some code
}();

在周围使用额外的大括号(如function 关键字之前)只是编码约定,可以在 Crackford 的著作、jQuery 和其他地方看到。


$(function(){

});

这是就绪处理程序的简写语法:

$(document).ready(function(){

});

更多信息:

【讨论】:

  • 进一步注意jQuery(someFunction) 将jQuery 对象作为第一个参数传递给回调。这允许您执行文档就绪处理程序的这个稍微安全但仍然简洁的版本:jQuery(function($){ ...use $ here without fear of global collision... });
  • 期待setTimeout 好处的原因 我个人将其归档在“反模式”类别中。为简洁起见,不值得在代码清晰度、IDE 代码辅助和调试方面有所损失;我将把代码缩短留给自动缩小工具。
  • function() { /* Some code */ }(); 实际上是不是有效的语法。
【解决方案2】:

我知道这个问题很老了,但我现在偶然发现了它,其他人也可能如此。我只是想指出,虽然 Sarfraz 的回答很棒,但不得不说,不,在大括号内写一个 自动执行的匿名函数 不是 em>编码约定。

function(){
  // some code
}();

将不起作用并给出SyntaxError,因为函数被解析为FunctionDeclaration,并且在这种情况下函数名称不是可选的

另一方面,Grouping Operator 确保内容被评估为FunctionExpression

见:Explain JavaScript's encapsulated anonymous function syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多