前言
使用闭包时要注意:闭包虽然简单易用,但也会造成佔用记忆体的问题。因为会让函式执行完毕后,某些情况下,闭包的变数仍然无法释放记忆体,所以使用闭包时还是要谨慎小心。
闭包简短的定义
巢状的function就可能会发生闭包,闭包就是用内层去使用外层的物件
来看一个闭包的例子
function foo(){ let a =0; function run(){ a++; return a } return run;}var f = foo();console.log(f());
执行结果
f() //1f() //2f() //3
上面程式码的大意:
我们来看函式foo定义了三件事:a = 0定义函式runreturn 函式run而函式run定义了两件事:a++return a结果:每执行一次f(),a的结果就会加1
也就是closure发生了记忆体让内层a的值,不会被释放记忆
闭包本质上就是一个匿名函式
也因为程式码只执行传回函式
对foo()而言,内层的function run()是函式run()对f而言,内层的函式function run()是一个匿名函式function(){}实际上,印出 f() 函式的範例中,建立了一个闭包(匿名函式),在执行传回函式run时这个匿名函式只做a++和return a,且即使foo()已经执行完毕,a变数依然是存活在传回的闭包範畴(记忆体)中。
重点
闭包将变数a本身关闭在自己的範畴(记忆体)中,而不是变数的值