JavaScript / jQueryclosures函数语法

有人可以解释下列function之间的区别:

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

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

 (function(){ }()); 

和jquery.ready()相同?

 $(function(){ }); 

谢谢!


 (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


 (function(){ }()); 

这是自我执行的匿名函数,但没有参数和运行/调用本身,因为()在最后。

这种模式在某些情况下变得非常有用。 例如,假设你想在每次500毫秒后运行一段代码,你自然会去找setInterval

 setInterval(doStuff, 500); 

但是,如果doStuff函数需要超过500毫秒的时间来完成它正在做的事情呢? 你会看到意想不到的结果,但是setInterval会一直在指定的时间不断地调用这个函数,而不pipedoStuff是否完成。

那就是那个模式进来的地方,你可以用setTimeout和自动执行的匿名函数一起做同样的事情,并避免像这样错误的 setInterval

 (function foo(){ doStuff; setTimeout(foo, 500); })() 

这个代码也将一次又一次地重复一次。 除非doStuff完成,否则setTimeout将不会被触发。 比使用不好的setInterval更好的方法。

你可以在这里testing它。

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

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

使用额外的大括号(就像function关键字之前)是简单的编码约定 ,可以在Crackford的着作,jQuery和其他地方看到。


 $(function(){ }); 

这是准备处理程序的简短语法:

 $(document).ready(function(){ }); 

更多信息:

  • 自我执行的匿名函数如何工作

我知道这个问题很老,但是现在我偶然发现了,其他人也是这样。 我只想指出,虽然Sarfraz的答案很好,但是不得不说,在大括号中写一个自我执行的匿名函数 不是一个编码惯例

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

将无法工作,并发出一个SyntaxError因为函数被parsing为一个FunctionDeclaration ,并且在这种情况下函数名称是不可选的

另一方面, 分组运算符确保将内容评估为FunctionExpression

请参阅: 解释JavaScript封装的匿名函数语法