有些人会启发内部(私有)函数和闭包的区别,因为它们看起来非常相似。
内部功能:
function a(param) {
function b(theinput) {
return theinput * 2;
};
return 'The result is ' + b(param);
};
封闭
function f() {
var b = "b";
return function () {
return b;
}
}
答案 0 :(得分:4)
您的第二个示例显式返回一个函数对象,该函数对象维护指向返回函数的函数内的变量的链接,而您的第一个示例只返回调用私有函数的结果。所以第二个例子是闭包。
这是你的第二个例子的略微修改版本,它更好地演示了一个闭包:
function f(){
var a = "foo";
// return an object containing two methods
// which can access and modify the private "a"
// variable even after the function has returned
return {
showA: function() {
alert(a);
},
changeA: function(str) {
a = str;
}
}
}
var fun = f();
fun.showA(); // "foo"
fun.changeA("blahblah");
fun.showA(); // "blahblah"
小提琴:http://jsfiddle.net/MKD6p/1
正如您所看到的,在函数返回后,堆栈帧尚未解除分配;里面的变量保持活跃,可以通过合适的界面进行播放。
您的第一个示例的内部函数 可以访问其外部作用域, 根据在其外部函数/ scope / 中声明的变量返回值闭合。但是由于函数或模块尚未返回,一旦(外部)函数返回,函数的局部变量就会被释放 - 因此,虽然内部函数确实形成了一个带有外部作用域的闭包,但它并不真正用作关闭是什么的有效例子。
答案 1 :(得分:2)
Inner Function是一个嵌套的函数调用,而Closure会将局部变量的生命周期保持在正常范围之外。
答案 2 :(得分:2)
MDN说:
您可以在函数中嵌套函数。嵌套(内部)函数对其包含(外部)函数是私有的。它也形成了一个封闭。
闭包是一个表达式(通常是一个函数),它可以包含自由变量以及绑定这些变量的环境(“关闭”表达式)。
由于嵌套函数是闭包,这意味着嵌套函数可以“继承”其包含函数的参数和变量。换句话说,内部函数包含外部函数的范围。
总结:
只能从外部函数中的语句访问内部函数。
内部函数形成一个闭包:内部函数可以使用外部函数的参数和变量,而外部函数不能使用内部函数的参数和变量。
答案 3 :(得分:2)
它们非常相似,因为它们都是两种功能。内部/私有功能只是可见性有限的功能。闭包是捕获周围范围的函数。这是一个代码示例来说明:
function example() {
var window = { 'location': null };
var maybeARedirect = function() {
window.location = "http://google.com";
}
maybeARedirect();
}
如果function() {}
构造仅创建了匿名函数,window
将引用全局对象,这会将用户重定向到Google。但是因为它创建了一个闭包,它只会在本地window
对象中设置变量并且没有效果。
在大多数具有匿名功能的语言中,它们至少具有充当闭包的能力。