-
之间有什么区别首先: -
(function () {
var Book = 'hello';
}());
第二: -
(function () {
var Book = 'hello';
})();
第一和第二类似的工作方式......
第三: -
(function ($) {
var Book = 'hello';
})(jQuery);
我需要使用哪种模式以及编码中的位置。我在阅读与backboneJS相关的文章时看到的第三个模块模式。
我从第三个“自我执行函数与参数”jQuery“”理解...
有任何关于立即调用函数表达式的信息(IIFE)。
谢谢!
答案 0 :(得分: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();
答案 1 :(得分: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.
答案 2 :(得分:7)
立即调用的函数表达式(IIFE)是JavaScript的核心功能之一。它的主要目的不是用一次性函数和变量来混淆命名空间。
如果仅使用变量或函数一次,则不需要使其可用于其余代码(例如,您可以进行私有访问)。如果是函数,您可以让它们匿名,如下所示:
(function(){
console.log("Hello symfony world!");
}());
答案 3 :(得分:4)
正如其他答案指出的那样,它们都是自动执行匿名函数或直接匿名函数。
第三个示例用于为函数外部的变量创建别名。这是一种防止名称冲突和创建代码的好方法,可以轻松更改函数中使用的模块。它本质上是一种依赖注入形式。
(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
答案 4 :(得分:4)
就像其他答案所说的那样,在第三个函数中,您将JQuery
传递给函数。
我想花点时间解释为什么前两个是相同的。
创建函数时,该函数的名称实际上是function pointer.例如,在function foo(){}
中,foo
是指向您刚刚创建的函数的指针(这解释了)像this这样的东西。您可以通过在函数名称末尾添加括号来取消引用该指针(从而执行该函数):foo()
。
因此,如果我们再次查看该代码,首先要创建函数:
function () {
var Book = 'hello';
}
然后你取消引用它,有效地执行函数:()
在第二个示例中,您在括号中包围了整个函数创建:
(function () {
var Book = 'hello';
})
这可确保您在下一个命令之前执行创建操作,即再次取消引用该函数:()
。在这种情况下,括号不是必需的,因为函数将在执行之前创建。
答案 5 :(得分:3)
所有三个示例都是立即调用函数表达式(IIFE)。
唯一的区别是,在第三个示例中,jQuery
作为变量传入,允许您使用其美元命名约定在IIFE中使用它。 e.g。
(function ($) {
var Book = 'hello';
$('#bookelement').html(Book);
})(jQuery);
答案 6 :(得分:1)
这些都是自动执行的功能。现在也称为立即调用函数表达式(IIFE)。
前两个完全相同,语法稍有不同,第三个是将parameter
作为jQuery对象传递。
答案 7 :(得分:0)
事实上,这三个都是自我执行的功能,而且真的取决于你需要做什么。
唯一区别在于3. 1和2之间是相同的。
与3的区别在于您将对jquery的引用作为参数传递。现在这个annoyomus函数中的所有函数都可以访问jque
答案 8 :(得分: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);
使用此示例,您可以将其与第一个,第二个和第三个方法进行比较。