内部(专用)功能和闭包

时间:2011-08-03 23:32:58

标签: javascript

有些人会启发内部(私有)函数和闭包的区别,因为它们看起来非常相似。

内部功能:

function a(param) {
    function b(theinput) {
        return theinput * 2;
    };
    return 'The result is ' + b(param);
};

封闭

function f() {
    var b = "b";
    return function () {
        return b;
    }
}

4 个答案:

答案 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对象中设置变量并且没有效果。

在大多数具有匿名功能的语言中,它们至少具有充当闭包的能力。