Javascript匿名关闭

时间:2013-04-16 09:03:24

标签: javascript anonymous-function

我已经阅读了很多关于Javascript中的闭包的内容 那些括号是什么? 我在mozilla.org上读到了封闭应该被定义为

(function(){...})();

但在http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html上,它表示闭包函数是

(function(){...}());

有什么不同或后者是错的? last()的目的是什么?你会把一些参数放进去吗? 我正在寻找一个很好的参考。

编辑: 此外,Mozilla.org

上有一个例子
var makeCounter = function() {
var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

为什么这个'功能'需要分号?如果需要在声明后立即调用,则应在结束分号之前放置a()。但没有。

4 个答案:

答案 0 :(得分:19)

语法

(function(){...})()

只是一个立即调用的匿名函数。使用括号无关紧要,因为底层代码是一个被声明和调用的函数。

闭包用于描述一种情况,即函数可以访问在其范围之外声明的变量,可通过闭包访问

为清楚起见:

如果我们有以下功能

   function hello() {
      alert("Hello");
   }

我们可以使用以下

调用该函数
hello()

调用函数'hello'。但是如果我们不想给它起一个名字,但仍然会调用它,那么我们可以做到

(function hello() {
   alert("Hello");
})()

与前一个调用hello

的示例完全相同

但是,在这种情况下,给函数命名为'hello'是没有意义的,所以我们可以简单地删除它:

(function() {
    alert("Hello");
})()

您原始问题中使用的符号是什么。

答案 1 :(得分:7)

您的示例显示Immediately Invoked Function Expression或IIFE。它对翻译说:

  • 这是一个功能
  • 它没有名字
  • 远离全球范围,即'window'
  • 立即致电

是的,您可以将参数放在last()中。例如:

(
    function(username){
        alert("Hello " + username);
    }
)("John Smith")

Closures是javascript的一项功能,它允许我们实现data hiding,它大致相当于C ++或Java等语言中的私有变量。

function getBmiCalculator(height, weight) {
    // These are private vars
    var height = height;
    var weight = weight;

    function calculateBmi(){
        return weight / (height * height);
    }
    return calculateBmi;
}

var calc = getBmiCalculator(1.85, 90);

// calc still has access to the scope where height and weight live.
var bmi = calc();
alert(bmi);

在这个例子中,身高&在钙被破坏之前,重量不能被垃圾收集。内存或“范围”部分,其中高度&重量存在是“封闭的”

答案 2 :(得分:3)

没有区别。你也可以这样做:

true && function(){ /* code */ }();
0,function(){ /* code */ }();

!function(){ /* code */ }(); // Facebook style
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// with new    
new function(){ /* code */ }
new function(){ /* code */ }() // if you need arguments then use brackets

答案 3 :(得分:1)

分组运算符可以将函数描述包围为没有调用括号,还包括调用括号。即以下两个表达式都是正确的FE:

      (function () {})();
      (function () {}());

Function Expression