闭包通俗理解
闭包是在现代JavaScript教程学习 综合列题来自于此,此文章当作自己的学习笔记总结。该教程链接:https://zh.javascript.info/
闭包 是指内部函数总是可以访问其所在的外部函数中声明的变量和参数,即使在其外部函数被返回了之后。
通俗说就是外部函数即使已被返回死亡,内部函数仍然可以访问在外部函数中的所有变量。
function Make()
{
let name = "mart";
function sayname()
{
alert(name);
}
sayname();
return sayname;
}
let readname = Make(); //!!
readname();
这个结果是弹出2次 名字;
1.按常理来说,在let readname = Make();执行弹出名字之后。readname();不会在弹出名字了,因为Make()这个函数已经返回死亡,其中的变量按正常来说应该被收回了。
2.但在javascript中有闭包这个概念,因此即使外部函数已经返回死亡,但若内部函数尚在引用之中,外部函数中的变量并未消失,仍然存在,通过内部函数的引用调用该内部函数,仍然可以访问到该变量。
闭包的用法 综合案列1:
function makeCounter() {
let count = 0;
function counter() {
return count++;
}
counter.set = value => count = value;
counter.decrease = () => count--;
return counter;
}
//当然 正常应该让名字相同,写为let counter = makeCounter();
let test = makeCounter(); //执行外部函数,并将内部函数对象返回,使得test能够引用他。
test.set(4); //此处调用内部对象的函数set,设置count初值。 由于闭包,外部函数中的变量count没有被回收。
test.decrease(); //4-1
alert(test()); //3
alert(test()); //4
不用闭包实现
let counter = {
count:0,
add:function(){
return this.count++;
},
set:function(value){
this.count = value;
},
};
counter.set(4);
alert(counter.add());
alert(counter.add());
闭包的用法 综合案列2:
function sum(a)
{
let currsum = a;
function f(b)
{
currsum+=b;
return f;
}
f.toString = function()
{
return currsum;
}
return f;
}
alert(sum(1)(3)(4)); //8
alert(sum(5)(8)(20));
sum(1)(3)(4)分析:sum(1)之后 会返回一个f(b)函数,该函数为内部函数,实现闭包,因此仍具有currsum。此时就变为了f(3),执行进行加法,之后再返回f(b),此时变为f(4),完成全部的加法,此时返回f之后,通过tostring转为字符串。