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封装的匿名函数语法