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