jQuery $(function() {}) vs (function () {})($)
我知道以下是
1 2 3 | $(function() { console.log("ready!" ); }); |
我也理解匿名JS函数是什么,但jQuery在使用一个函数调用时会做什么特别的事情。即:
1 2 3 | (function() { console.log("ready!" ); })($); |
后者只是一个使用jQuery的普通匿名JS函数(即它不会被视为
我觉得以前必须要问过,但如果有的话,我找不到它。
正如你所提到的,前者确实是
至于后者,这只是一个立即调用的函数表达式。
1 2 3 | (function ($) { console.log('ready'); })(jQuery); |
此函数只是一个匿名函数,它接收名为
IIFE还可用于隔离范围并避免包含多个JavaScript文件的Web应用程序中的全局变量。在这种情况下,可以使用无参数IIFE:
1 2 3 4 5 | (function () { // x is only accessible within this IIFE var x; // do something... })(); |
有关立即调用函数表达式的更多信息,请参阅此问题:javascript中自执行函数的用途是什么?
实际上,第一个是
但第二个是立即调用函数表达式(IIFE),一个声明并立即调用的匿名函数。
实际上,正确的语法(在您的示例中缺少参数)是:
1 2 3 | (function($) { //my $ object is local now })(jQuery); |
在这种情况下,您将使用参数调用匿名函数。
这种模式(IIFE)的主要优点是:隔离你的代码(你可以创建任意数量的变量,它将被限制在你的匿名函数范围内,除非你返回一些东西)。这种模式用于定义"私有"和"公共"方法。像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var myModule = (function() { function privateFunction() { console.log("I can't be accessed from outside :("; } var privateVar ="me too :("; function publicFunction() { console.log("Hey! I'm here!"; } /* expose what you want */ return { publicFunction: publicFunction } })(); myModule.publicFunction(); //Hey! I'm here! myModule.privateFunction(); //undefined; |
你也可以称之为模块模式。
在第二个示例中,您使用参数调用最近创建的匿名函数,并且您的匿名函数接收该参数。这是一种依赖性注射方式。
这样,您可以将函数内的全局变量作为本地操作。请注意,在第一个示例中,我们传递一个
最后,让我列出一些将参数传递给从这里抓取的IIFE的其他优点:
-
它更快:JavaScript首先查找本地范围(之前
爬上去)。它可能会提高性能。 -
帮助缩小:minifier现在可以重命名你的变量
范围为一个字母的单词,减少代码大小。
Is the latter just a normal anonymous JS function that uses jQuery (ie. NOT shorthand for $(document).ready() and so will execute immediately)?
是的,确切地说,它只是一个普通的IIFE,它将
1 2 3 | (function(dollarSignArgument) { console.log("not really ready!" ); })($) |
它会立即执行