我已经阅读了很多关于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()。但没有。
答案 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。它对翻译说:
是的,您可以将参数放在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 () {}());