JavaScript中在自声明匿名函数之前的美元符号是什么意思?

41

这两者之间有什么区别:

$(function () {
    // do stuff
});

(function () {
    // do stuff
})();
5个回答

55

第一种方法使用jQuery将一个函数绑定到document.ready事件。第二种方法声明并立即执行一个函数。


1
啊,好的,所以主要区别在于第二个不等待文档加载完成,直接立即执行? - xil3
4
@xil3 - 正确。如果函数需要修改DOM,则第一个选项比较合适。如果只需要JS的效果,则第二个选项比较有用。很少情况下两个选项是可互换的,但通常前者更可取,因为大多数jQuery代码用于操作DOM元素。 - g.d.d.c

26

$(function() {});

是jQuery的一种快捷方式,用于表达:

 $(document).ready(function() { 
     /* Handler for .ready() called. */ 
 });

(function() {})();是即时调用函数表达式(Immediately Invoked Function Expression,IIFE)。“即时调用”表示它是一个表达式(而不是语句),并且在创建之后立即被调用。


1
自执行匿名函数 - aziz punjani
8
我更喜欢称它们为“立即调用函数表达式”,而不是“自执行”或“自调用”。例如,(function () { arguments.callee() })() 将被称为“自执行/自调用的匿名函数”,而 (function(){})() 只是一个立即调用的匿名函数。详情请见:http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife - nwellcome

5

它们都是匿名函数,但 (function(){})() 会立即执行,而 $(function(){}) 只有在文档准备好后才会被调用。

jQuery 的工作原理类似于这样。

window.jQuery = window.$ = function(arg) {
    if (typeof arg == 'function') {
        // call arg() when document is ready
    } else {
       // do other magics
    }
}

所以你只需要调用jQuery函数并传入一个函数,在文档准备好时会调用它。

“自执行匿名函数”与此相同。

function a(){
    // do stuff
}
a();

唯一的区别在于你不会污染全局命名空间。

5

其中一个是jquery的$(document).ready函数,另一个是调用自身的匿名函数。


1
那其实不是闭包。只是一个自调用匿名函数。它们都不是闭包。参见:https://dev59.com/6XVD5IYBdhLWcg3wBm5h - gilly3

2
$(function () {
    // It will invoked after document is ready
});

这个函数在文档准备就绪后执行,也就是说,在执行它之前整个HTML都应该被加载完毕,但在第二种情况下,函数在创建后立即被调用。

(function () {
    // It will invoked instantly after it is created
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接