什么';javascript中闭包的含义是什么?

什么';javascript中闭包的含义是什么?,javascript,closures,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 =

从互联网上查阅

它说它可以像这样从外部访问函数内部值:

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 a(){           
    var scope = "local scope";
    function f(b){return scope + b;}    
    return f; 
} 
console.log(a()('found here'));
console.log(a()(' not found here'));
但在这种情况下,如果需要,您可以操纵该数据


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

以下是闭包的一种可能用法:

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”局部变量“活动”。它的值保留在内存中,它是持久的,与没有内部函数时不同:

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

我不确定关于闭包的基本原理还有更多的话要说,其他程序员会做出判断。不管怎么说,如果你觉得头痛,你可能会对内存中的低级别发生的事情感兴趣:。

你是如何得到“需要”这样编码的印象的?这是不需要的。这是一个闭包的演示。除非你必须这样做,否则你不必这样做。同样,在你需要一个随机数之前,你不需要使用
Math.random
。可能是重复的和其他几个问题。你真的不需要阅读问题标题以外的内容吗?谢谢,这对我很有帮助!根据您的回答,我的理解是闭包可以创建类似对象的东西,比如
getUidA
,而
getUidB
可以存储它们自己的状态independently@chanjianyi我想我们可以这样说:-)但我不鼓励您使用它来模拟对象。我不知道这是否是一种很糟糕的做法,但至少这不是一种常见的做法:-/无论如何,不要害怕问是否还有灰色地带:-)XD我发现一个参考似乎很好:@chanjianyi我正要与你分享:-D但我试图先改进这些旧答案:和:-)
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