5

可能重复:
这是什么意思?(函数 (x,y)){…}){a,b); 在 JavaScript 中

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

(function( window, undefined ) {

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

这是什么意思?当我使用 Google javascript 函数时,我得到的只是

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

我知道使用这些类型的功能

4

3 回答 3

4

简短的回答:这些是提供词法范围和闭包的立即调用函数。

如需更好的解释,请查看我前段时间发布的这个答案。

更新:

词法作用域意味着在函数内声明的变量在函数体之外是不可见的。

闭包是一种保留对否则超出范围的变量的引用的方法,因为如果它们在定义函数体的范围内,那么它可用于该函数的任何后续调用。请参阅:关闭维基百科

更新 2:

如果您真的想了解所有这些内容,那么我强烈建议您观看 Gerry Sussman 和 Hal Abelson 于 1986 年在麻省理工学院举办的计算机程序结构和解释讲座(可在 YouTube 上找到)。在我看来,没有比观看这些讲座更好的方式来真正理解 JavaScript,即使它们不是关于 JavaScript 的。您将很快看到 Brendan Eich 在设计 JavaScript 时真正的灵感来源是哪种语言。提示:这不是 Java。

于 2012-09-23T03:04:03.693 回答
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
于 2012-09-23T03:06:45.410 回答
1

下面是一个函数语句。它可以单独存在。

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

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

foo();

下面是一个函数表达式(如匿名函数**见底部编辑**)。与任何其他表达式一样,它就像一个右值,您可以将它分配给一个变量

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 个参数,window并且undefined. 我们将第一个参数作为window(由浏览器提供给调用者;它是一个全局对象)传递。请注意,我们没有传递任何第二个参数。但是由于我们期望函数中有第二个参数但没有传递任何参数,Javascript 解释器将为它分配一个undefined值(如解释器中定义的那样)。所以变量(参数)undefined现在包含未定义。

接受这两个值作为参数的主要目的是使函数独立于全局变量。(想象一下,如果某些 JS 脚本或浏览器插件将 undefined 更改为其他内容会发生什么!)

参考: 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"); 
}

是一篇关于它们用法的有趣文章。

于 2012-09-23T03:44:44.400 回答