为什么JavaScript函数会像这样?

5

可能是重复问题:
在JavaScript中,(function (x,y)){…}){a,b);是什么意思

我是javascript的初学者。我知道如何编写JS用户定义函数。 但最近我遇到了一些我无法识别的东西。有人能解释一下这是什么吗?

(function( window, undefined ) {

    var jQuery = (function() {
    });
           window.jQuery = window.$ = jQuery;
})(window);

这是什么意思?当我谷歌JavaScript函数时,我只得到了...
function foo(){ 
    alert("This is an alert"); 
}

我知道如何使用这些类型的函数。

5
Google 自执行函数。 - SLaks
3
请看我之前发布的这个答案 - rsp
查看Ben Alman的综合文章,了解这些函数。 - Joseph Silber
3个回答

4
简短回答:它们是立即调用的函数,提供词法作用域和闭包。
更好的解释请查看我之前发布的这个答案
更新:
词法作用域意味着在函数内部声明的变量在函数体外部不可见。
闭包是一种保持对变量引用的方法,否则它们将超出范围,因为如果它们在定义函数体的范围内,则可以在任何后续调用该函数时使用。参见:维基百科上的闭包
第二次更新:
如果你真的想理解所有这些内容,我强烈推荐观看1986年由Gerry Sussman和Hal Abelson主讲的MIT讲座《计算机程序的构造和解释》YouTube上有)。在我看来,没有比观看这些讲座更好地理解JavaScript的方式了,尽管它们不是关于JavaScript的。你很快就会看到Brendan Eich设计JavaScript时真正的灵感来源是哪种语言。提示:它不是Java。

哦,谢谢,该函数将在定义时立即执行,你能解释一下词汇作用域和闭包的含义吗? - Kajal
JavaScript 中的每个函数在技术上都形成了一个闭包。这不是立即执行函数的特性。 - Felix Kling

3

这是一个自执行函数,也被称为模块模式

它通常用于引入publicprivate命名空间,因为在该函数内部定义的属性无法从外部访问,而返回的属性可以。

例如,如果您返回一个对象,那么您可以像这样将该函数视为对象:

var a = (function() {
  var a= 0; // this is only accessible inside this function
  var b = {
    a: 1 // this will be returned and therefore be accessible on the outside
  };
  return b;
})();

console.log(a.a); // outputs 1

不,它不会自行执行。该函数甚至无法命名自己,因为它是匿名的,从未存储在命名变量中。 - Ben Voigt
+1 是为了提示为什么要使用这个模式。 - Geoffrey McGrath

1
以下是一个函数声明。它可以独立存在。
function foo(){ 
    alert("This is an alert"); 
}

可以这样“调用”(执行)它:

foo();

以下是一个函数表达式(例如匿名函数**见底部的编辑**)。 像任何其他表达式一样,它就像一个rvalue,您可以将其分配给变量。
var f = function (){ 
    alert("This is an alert"); 
};

然后,可以像这样“调用”(执行)它:

f();

或者您可以像这样对其使用运算符:

(function (){ 
 alert("This is an alert"); 
})();

请注意,现在可以将此变量作为参数传递给其他函数!(即我们可以将函数作为参数传递)。
现在,让我们分析一下:
(function( window, undefined ) {
    //blah blah blah -1
    //blah blah blah -2
})(window);

这可以分为两个部分:

var f = function( window, undefined ) {
    //blah blah blah
};
f(window);

函数(分配给f)传入2个参数,windowundefined。我们将第一个参数作为window(由浏览器提供给调用者的全局对象)。请注意,我们没有传递任何第二个参数。但是由于我们期望函数中有第二个参数,但没有传递任何参数,因此Javascript解释器将会将undefined值(如解释器所定义)赋值给它。因此,变量(参数)undefined现在包含未定义的值。
接受这两个值作为参数的主要目的是使函数独立于全局变量。(想象一下,如果某个JS脚本或浏览器插件将未定义的值更改为其他值,会发生什么!!)

Refer: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators

编辑:

正如@FelixKling所评论的那样,函数表达式不必是匿名的,它们可以有名称。

var f = function foo(){ 
    alert("This is an alert"); 
}

这篇是关于他们使用情况的有趣文章。


为了完整性:函数表达式不一定是匿名的,它们可以被命名为 var foo = function bar() {...}; - Felix Kling
谢谢@FelixKling。我已经添加了那个信息。 - prashanth

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