我了解以下是$( document ).ready()
的简写:
$(function() {
console.log( "ready!" );
});
我也理解匿名JS函数是什么,但jQuery在使用one函数调用时会做什么特别的事情。即:
(function() {
console.log( "ready!" );
})($);
后者只是一个使用jQuery的普通匿名JS函数(即它不会被视为$(document).ready()
的简写,因此会立即执行)?
我觉得以前必须要问过,但是如果有的话,我找不到它。
答案 0 :(得分:9)
正如你所提到的,前者确实是if (req.body.user) {do something...}
的简写。
至于后者,这只是一个立即调用函数表达式。
$(document).ready()
这个函数只是一个匿名函数,它接收一个名为(function ($) {
console.log('ready');
})(jQuery);
的参数。该函数是立即调用,并带有一些值(在本例中为$
)作为参数。
IIFE还可用于隔离范围以及避免包含多个JavaScript文件的Web应用程序中的全局变量。在这种情况下,可以使用无参数IIFE:
jQuery
有关立即调用函数表达式的详细信息,请参阅此问题:What is the purpose of a self executing function in javascript?
答案 1 :(得分:7)
第一个确实是$( document ).ready()
的简写,如here所示。
但第二个是立即调用函数表达式(IIFE),这是一个声明并立即调用的匿名函数。
事实上,正确的语法(示例中缺少的参数)是:
(function($) {
//my $ object is local now
})(jQuery);
在这种情况下,您使用参数调用匿名函数。
此模式(IIFE)的主要优点是:隔离您的代码(您可以根据需要创建任意数量的变量,它将仅限于您的匿名函数范围强>,除非你归还某些东西)。此模式用于定义“private”和“public”方法。像这样:
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;
您也可以将其称为模块模式。
在第二个示例中,您使用参数调用最近创建的匿名函数,并且您的匿名函数接收该参数。这是依赖注入的一种方式。
这样,您可以将函数内的全局变量作为本地操作。请注意,在第一个示例中,我们传递了一个jQuery
对象,并在函数内将其作为$
进行操作。有人覆盖jQuery对象比较困难,但是,某些脚本可以重新分配全局美元符号,特别是如果您没有完全控制您的应用程序。这样,你总是传递te jQuery
对象并将其操作为$
。
最后,让我列出将参数传递给从here抓取的IIFE的其他一些优点:
它更快:JavaScript首先查找本地范围(之前 爬上去)。它可能会提高性能。
帮助缩小:minifier现在可以重命名你的变量 范围为一个字母的单词,减少代码大小。
答案 2 :(得分:3)
后者只是一个使用jQuery的普通匿名JS函数(即不是$(document).ready()的简写,因此会立即执行)?
是的,确切地说,它只是一个普通的IIFE,它将$
个全局变量作为参数
(function(dollarSignArgument) {
console.log( "not really ready!" );
})($)
它会立即执行