42

有什么区别 -

第一的 :-

(function () {

    var Book = 'hello';

}());

第二:-

(function () {

    var Book = 'hello';

})();

第一个和第二个在工作中是相似的。

第三 :-

(function ($) {

    var Book = 'hello';

})(jQuery);

我需要使用什么模式以及在我的编码中使用什么模式。我在阅读与backboneJS 相关的文章时看到的第三个模块模式。

我从第三个“带有参数“jQuery”的自执行函数”中了解到的......

任何人都可以给我一些关于立即调用函数表达式(IIFE)的想法。

谢谢 !!

4

9 回答 9

29

在所有情况下,您都在执行匿名函数。我认为 1 与 2 相同。在第三种情况下,您将 jQuery 作为参数传递。当你想在你的函数范围内封装 jQuery 时,就会这样做。

例如,在您的应用程序中,jQuery var 可以是 jQuery。但在您的匿名函数中,您可能希望将其用作 $。

(function ($) {
    //Here jQuery is $
    var Book = $(document.body).text();    

})(jQuery);

//Out of your function, you user jQuery as jQuery (in this example)
var Book = jQuery(document.body).text();
于 2013-10-21T10:16:35.607 回答
9

这称为闭包以避免与其他库发生冲突,例如mootools使用$. 这样,您可以确保$在该函数中使用并jQuery作为参数传递。

(function ($) {
   $(function () { // Here in this block you can use '$' in place of jQuery
    .......
   });
})(jQuery); //<----passing jquery to avoid any conflict with other libraries.
于 2013-10-21T10:29:22.693 回答
7

立即调用函数表达式 (IIFE) 是 JavaScript 的核心功能之一。它的主要目的是不要用一次性函数和变量来混淆命名空间。

如果您只使用一次变量或函数,则无需使其可用于其余代码(例如,您可以进行私有访问)。如果是函数,你可以让它们匿名,就像下面这样:

(function(){
  console.log("Hello symfony world!");
}());

请检查此链接

此外,这是一个不到 7 分钟的有用说明视频

于 2013-10-21T10:40:13.473 回答
5

正如其他答案指出的那样,它们都是自执行匿名函数或立即匿名函数。

第三个示例用于为函数外部的变量创建别名。这是防止名称冲突和创建可以轻松更改函数中使用的模块的代码的好方法。它本质上是一种依赖注入的形式。

(function (doc, win, $, myModule) {
    // Code
}(document, window, jQuery, window.MYAPP.myModule));

doc, win,$myModule是注入变量。使用这种模式,更改任何注入的组件都是微不足道的。像这样

(function (doc, win, $, myModule) {
    // Code
}(document, window, jQuery, window.MYAPP.myModule2)); //Use myModule2 instead myModule
于 2013-10-21T10:23:34.133 回答
4

就像其他所有答案所说的那样,在第三个函数中,您将传递JQuery给该函数。

我想花点时间解释一下为什么前两个是一样的。

当您创建一个函数时,该函数的名称实际上是一个函数指针。例如, infunction foo(){}foo一个指向你刚刚创建的函数的指针(它解释了这样的东西。您可以通过在函数名称的末尾添加括号来取消引用该指针(并因此执行函数):foo()

因此,如果我们再次查看该代码,在第一,首先创建函数:

function () {

    var Book = 'hello';

}

然后你取消引用它,有效地执行函数:()

在第二个示例中,您将整个函数创建括在括号中:

(function () {

    var Book = 'hello';

})

这可确保您在下一个命令之前执行创建操作,即再次取消引用该函数:(). 在这种情况下,括号并不是必需的,因为无论如何都会在执行之前创建函数。

于 2013-10-21T15:41:59.107 回答
3

所有三个示例都是立即调用函数表达式( IIFE )。

唯一的区别是,在第三个示例jQuery中,它作为变量传入,允许您在 IIFE 中使用其美元命名约定来使用它。例如

(function ($) {
  var Book = 'hello';
  $('#bookelement').html(Book);
})(jQuery);
于 2013-10-21T10:17:39.070 回答
1

这些都是自执行功能。现在也称为立即调用函数表达式 (IIFE)。

前两个完全相同,语法略有不同,第三个是将 aparameter作为 jQuery 对象传递。

于 2013-10-21T10:17:15.837 回答
0

事实上,这三个都是自执行函数,并且 ti 真的取决于你需要做什么。

唯一的区别是3之间。1和2是一样的。

与 3 的区别在于您将 jquery 的引用作为参数传递。现在这个 annoyomus 函数中的所有函数都可以访问 jque

于 2013-10-21T10:18:01.893 回答
0

所有这些都是自调用函数的示例。

这将使您清楚地看到:-

var my_func = function(){
    var internal_var = "Hello";
    return internal_var;
};

var my_func2 = function(name){
    var internal_var = "Hello";
    return internal_var;
};

var long_var_name = "I can be some object or number or object or array";

var result1 = (my_func());
var result2 = (my_func)();
var result3 = (my_func2)(long_var_name);

console.log(result1, result2, result3);

使用此示例,您可以将其与FirstSecondThird方法进行比较。

于 2017-12-22T13:00:24.570 回答