来自互联网
它表示可以从外部访问函数内部函数,如下所示:
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
?
答案 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'));
但在这种情况下,如果需要,您可以操作该数据。
我的意思是说我们可能需要关闭。