Javascript匿名关闭

Tri*_*ung 17 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;
    }
  }  
};
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*ter 21

语法

(function(){...})()
Run Code Online (Sandbox Code Playgroud)

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

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

为清楚起见:

如果我们有以下功能

   function hello() {
      alert("Hello");
   }
Run Code Online (Sandbox Code Playgroud)

我们可以用以下函数调用该函数

hello()
Run Code Online (Sandbox Code Playgroud)

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

(function hello() {
   alert("Hello");
})()
Run Code Online (Sandbox Code Playgroud)

这将与前一个调用示例完全相同 hello

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

(function() {
    alert("Hello");
})()
Run Code Online (Sandbox Code Playgroud)

这是您原始问题中使用的符号.


Kev*_*edy 8

您的示例显示了立即调用的函数表达式或IIFE.它对翻译说:

  • 这是一个功能
  • 它没有名字
  • 远离全球范围即'窗口'
  • 现在叫它

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

(
    function(username){
        alert("Hello " + username);
    }
)("John Smith")
Run Code Online (Sandbox Code Playgroud)

闭包是javascript的一个特性,它允许我们实现数据隐藏,这大致相当于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);
Run Code Online (Sandbox Code Playgroud)

在这个例子中,高度和重量不能被垃圾收集,直到calc被破坏.存在高度和重量的记忆或"范围"部分是"封闭的"