什么是javascript中闭包的含义?

时间:2015-09-02 09:54:26

标签: javascript closures

来自互联网

它表示可以从外部访问函数内部函数,如下所示:

function a(){           
    var scope = "local scope";
    function f(){return scope;}    
    return f; 
} 
console.log(a()());//it can get the value 'local scope'

我的问题是与此代码的不同之处

function a(){           
    var scope = "local scope"; 
    return scope; 
} 
console.log(a());//it can get the value 'local scope' too

那么关闭的意义是什么?

为什么需要通过包裹function

来返回值

2 个答案:

答案 0 :(得分:1)

以下是闭包的可能用途:

var getUid = function () {
    var uid = 1;
    return function () {
        return uid++;
    };
};

// invoke the wrapping function immediately
// to create a single local scope
getUid = getUid();

getUid(); // 1
getUid(); // 2
getUid(); // 3

正如您所看到的,封闭允许保持" uid"局部变量" alive"函数调用之间。它的值保留在内存中,它是持久的,不像没有内部函数时:

var getUid = function () {
    var uid = 1;
    return uid++;
};

getUid(); // 1
getUid(); // 1
getUid(); // 1

总而言之,关于闭包的有趣之处在于能够使局部变量持久化。

在你的例子中,有些东西值得注意。注意写a()()与写(a())()相同的事实。这意味着你调用包装函数" a"首先,创建一个新的范围,因此,内部的所有内容" a"完全重建。

如果您继续以这种方式创建新范围,则没有理由使用闭包。实际上,这样做可以使函数调用之间的变量保持活跃(如上所述)。让我们看看getUid()如果以这种方式使用会发生什么:

var getUid = function () {
    var uid = 1;
    return function () {
        return uid++;
    };
};

getUid()(); // 1
getUid()(); // 1
getUid()(); // 1

相同的结果就好像没有内部功能一样。不是很有用吗?但是,如果需要创建多个范围,仍然可以重复调用包装函数,但是您必须将内部函数存储到变量中:

var getUidA = getUid(); // scope A
var getUidB = getUid(); // scope B

getUidA(); // A 1
getUidA(); // A 2
getUidB(); // B 1
getUidA(); // A 3
getUidB(); // B 2

我不确定关于闭合的基本原理还有更多的话要说,其他程序员会判断。无论如何,如果你已经准备好头痛,你可能会对内存中的低级别内容感兴趣:https://stackoverflow.com/a/31778897/1636522

答案 1 :(得分:0)

关于什么是封闭阅读这一个,最好的解释
JavaScript closures vs. anonymous functions

function a(){           
    var scope = "local scope"; 
    return scope; 
} 
console.log(a());

在这种情况下,如果需要任何

,则只能返回不能对变量应用任何操作的局部变量
function a(){           
    var scope = "local scope";
    function f(b){return scope + b;}    
    return f; 
} 
console.log(a()('found here'));
console.log(a()(' not found here'));

但在这种情况下,如果需要,您可以操作该数据。

我的意思是说我们可能需要关闭。