为什么javascript函数是这样的

为什么javascript函数是这样的,javascript,Javascript,可能重复: 我是javascript的初学者。我知道如何编写JS用户定义函数。 但最近我遇到了一些我认不出来的东西。有人能给我解释一下这是什么吗 (function( window, undefined ) { var jQuery = (function() { }); window.jQuery = window.$ = jQuery; })(window); 这是什么意思?当我搜索javascript函数时,我只得到 function foo()

可能重复:

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

(function( window, undefined ) {

    var jQuery = (function() {
    });
           window.jQuery = window.$ = jQuery;
})(window);
这是什么意思?当我搜索javascript函数时,我只得到

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

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

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

为了更好的解释,请看我前一段时间发布的文章

更新:

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

闭包是一种保持对变量的引用的方法,否则这些变量将超出范围,因为如果它们位于定义函数体的范围内,则该函数的任何后续调用都可以使用闭包。请参阅:

更新2:

如果你真的想了解所有这些,那么我强烈建议你观看1986年由Gerry Sussman和Hal Abelson主持的麻省理工学院讲座
(). 在我看来,要真正理解JavaScript,没有比观看这些讲座更好的方法了,即使它们不是关于JavaScript的。您将很快看到Brendan Eich在设计JavaScript时真正的灵感来自哪种语言。提示:它不是Java。

它是一个自行执行的函数,也称为

它通常用于引入
public
private
名称空间,因为在所述函数内部定义的属性在返回属性时无法从外部访问

例如,如果返回一个对象,则可以将函数视为如下对象:

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
foo();
f();
(function (){ 
 alert("This is an alert"); 
})();

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

function foo(){ 
    alert("This is an alert"); 
}
可以这样“调用”(执行):

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
foo();
f();
(function (){ 
 alert("This is an alert"); 
})();

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

var f = function (){ 
    alert("This is an alert"); 
};
然后,可以像这样“调用”(执行):

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
foo();
f();
(function (){ 
 alert("This is an alert"); 
})();
或者,您可以在其上使用运算符,如下所示:

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

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

参考:

编辑:

正如@FelixKling所评论的,函数表达式不需要匿名,它们可以有名称

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

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

Google自动执行函数。请看我不久前发布的文章。查看这些函数。噢,谢谢,函数一定义就执行。你能解释一下词法范围和闭包的术语吗。JavaScript中的每个函数在技术上形成一个闭包。它不是立即执行的函数的特征。不,它不会自动执行。函数甚至不能命名自己,因为它是匿名的,从不存储在命名变量中。+1用于暗示使用此模式的原因。完整性:函数表达式不必是匿名的,它们可以命名为:
var foo=function bar(){…}。谢谢@FelixKling。我已经补充了这一信息。