【问题标题】:why are javascript functions like this [duplicate]为什么像这样的javascript函数[重复]
【发布时间】:2012-09-23 02:59:34
【问题描述】:

可能重复:
What does this mean? (function (x,y)){…}){a,b); in JavaScript

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

(function( window, undefined ) {

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

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

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

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

【问题讨论】:

标签: javascript


【解决方案1】:

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

如需更好的解释,请查看我前段时间发布的this answer

更新:

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

闭包是一种保留对否则超出范围的变量的引用的方法,因为如果它们在定义函数体的范围内,那么该函数的任何后续调用都可以使用它。见:Closure on Wikipedia

更新 2:

如果您真的想了解所有这些内容,那么我强烈建议您观看 Gerry Sussman 和 Hal Abelson 于 1986 年在Structure and Interpretation of Computer Programs MIT 的讲座 (available on YouTube)。在我看来,没有比观看这些讲座更好的方式来真正理解 JavaScript,即使它们不是关于 JavaScript 的。您将很快看到 Brendan Eich 在设计 JavaScript 时真正的灵感来源是哪种语言。提示:这不是 Java。

【讨论】:

  • 哦,谢谢,函数一被定义就会被执行,你能解释一下词法作用域和闭包的术语吗?
  • JavaScript 中的每个函数在技术上形成一个闭包。这不是立即执行函数的特征。
【解决方案2】:

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

它通常用于引入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

【讨论】:

  • 不,它不会自行执行。该函数甚至不能为自己命名,因为它是匿名的并且从不存储在命名变量中。
  • +1 用于提示使用此模式的原因。
【解决方案3】:

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

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 个参数,windowundefined。我们将第一个参数作为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"); 
}

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

【讨论】:

  • 为了完整性:函数表达式不必是匿名的,它们可以命名为:var foo = function bar() {...};
  • 感谢@FelixKling。我已经添加了这些信息。
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2021-09-22
  • 2018-03-08
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多