2013-04-16 60 views
15

我已阅读了很多关于Javascript中的闭包的内容 这些括号是什么? 我对mozilla.org读它说闭合应该被定义为Javascript匿名关闭

(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; 
    } 
    } 
}; 

为什么需要这个 '功能' 分号的例子吗?如果需要在声明后立即调用,则应在结尾分号前加上()。但没有。

+0

它不是一个封闭,它是一个匿名函数。 – zerkms

+1

[这些自我执行的匿名函数(又名IIFE)实现之间的区别是什么](http://stackoverflow.com/questions/16026909/what-is-the-difference-between-those-self-executing -anonymous-function-aka-iife) – zerkms

+1

[(...())与(...)()在javascript中的重复](http://stackoverflow.com/questions/8774425/vs-in -javascript-closures) – Quentin

回答

17

语法

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

只是一个立即调用匿名函数。不管你如何使用括号,底层代码都是被声明和调用的函数。

闭包的,而不是用来描述这样一种情况:函数可以访问它的范围之外声明的变量,通过关闭

为清楚起见访问:

如果我们有以下功能

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

我们可以调用以下函数

hello() 

它调用函数'hello'。但是,如果我们不希望给它一个名称,但仍然调用它,那么我们可以做

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

这将做同样的呼吁hello

然而前面的例子,在这种情况下有在给该函数的名字没有一点“你好”,所以我们可以简单地将其删除:

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

这是你原来的问题使用的符号。

+0

我相信 - 我在说这两种调用函数表达式的方法都是一样的。而且这些闭包与立即调用函数表达式不同。让我知道如果我误解了这个问题:) – AlanFoster

+0

是否有关于调用括号的任何好文档? –

+0

@ user1978421我已经为你添加了一个渐进的例子 – AlanFoster

2

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

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 
+2

为什么?这一切都是正确的,但我怀疑JavaScript初学者会理解这些工作的原因。 –

+0

因为在某些情况下可以保存1个字符:) – Ildar

+2

这不是我的意思。例如。为什么'function(){/ * code * /}());'或'+ function(){/ * code * /}();''while function(){/ * code * /}( );'或'* function(){/ * code * /}();'不?这些行允许函数调用的特征是什么? –

7

您的示例显示了Immediately Invoked Function Expression或IIFE。它说的解释:

  • 这里是一个功能
  • 它没有名字
  • 从全球范围内保持它拿走即“窗口”
  • 现在

叫它是,你可以把参数放在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); 

在该示例中,高度&重量不能被垃圾收集,直到计算值被破坏。内存段或“范围”,其中存在的权重高度为“关闭”

0

分组操作符可以在没有调用括号的情况下围绕函数描述,并且还包括调用括号。即下面两个表达式都是正确的FE:

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

Function Expression