理解Javascript闭包
闭包是ECMAscript的一个非常重要的特征,但很难用一个适当的定义描述它。虽然关闭是很难描述清楚,它很容易创建,或者,漫不经心地创造它。然而,闭包的存在实际上是一个潜在的问题。为了避免倒闭的无意的创作更好的使用闭包的好处,有必要了解关闭的机制。闭包的定义
关于闭包的定义太多了,尤其是一些定义非常抽象,像这样:
一个闭包是一个表达式(通常是一个函数),它可以是空闲的。
粗略地说,闭包是一个表达式,它有一些自由变量和绑定这些变量的执行环境。这个定义写得太多了,但是很难理解。
还有另一个定义:
所有的功能都关闭了,这个定义让我很困惑。换句话说,因为Javascript没有块作用域,闭包通常是指函数。
我们不想在这里讨论函数和闭包之间的关系,让我们给出一个我认为更容易理解的定义。
首先,闭包的存在是基于范围链的,由于作用链的机制,所有函数(甚至全局函数)都可以引用上下文执行环境中的变量(自由变量)。
第二,闭包中必须有一个自由变量。顺便说一下,两个变量是1。局部变量(绑定变量)2。非局部变量(自由变量)
最后,它仍然是在语境的语境下存在的,也就是说,内部功能比它的外部功能有更长的生命周期。
关于闭包定义的解析
关于闭包定义的两点一直在考虑是否必须同时满足。
首先,如果闭包中没有自由变量,也就是说,它不能访问外部变量,那么闭包的意义就丧失了。
第二,如果函数中存在自由变量,当它的上下文被破坏时,它就会被破坏,你可以想象内部函数,尽管它可以访问它的外部函数变量,但是当外部函数完成时它会被恢复,在这种情况下,闭包的讨论是没有意义的。
看两个例子:
复制代码代码如下所示:
VAR:=((){()函数
洛卡拉洛卡拉var = ;
InnerFn();
仅内部函数调用
功能innerfn(){
洛卡拉=innerchange ;
}
返回{
GetLocalA:函数(){
返回空;
}
};
});
ObjectA.getLocalA();
objecta.getlocala =函数(){
返回洛卡拉;
};
/ / console.log(objecta.getlocala());洛卡拉 / /错误:未定义
无功objectb =(函数(){()
无功localb =localb ;
返回{
GetLocalB:函数(){
返回空;
},
UpdateGetLocalB:函数(){
this.getlocalb =函数(){
返回localb;
};
},
UpdateLocalB:函数(){
localb =changelocalb ;
}
};
});
Console.log((objectb。getlocalb)); / /空
通过其他闭包更改
ObjectB.updateGetLocalB();
Console.log((objectb。getlocalb)); / / localb
ObjectB.updateLocalB();
Console.log((objectb。getlocalb)); / / changelocalb
闭包的优点和缺点
闭包的优点是,在闭包中,可以访问参数和变量(除了这个和参数),以定义它们的外部函数。
闭包的主要问题是它保存了包含它的函数的范围,所以它比一般函数占用更多的内存空间。因此,过度使用闭包是不合适的。
应用闭合
闭包最基本的应用场景是通过保护内部变量(如模块模式)来保护私有变量。