<html>
<head></head>
<body>
<button onclick="count();">计数器<span id="test">0</span></button>
<script>
var count = (
function(){
let no = 0;
return function add() {
no++;
document.getElementById('test').innerText = no
//return no;
}
}
)()
</script>
</body>
</html>
闭包形成的3个缺一不可的条件:
- 函数
a
中包含函数b
, - 函数
a
中定义的变量(或更上层作用域的,即函数b
外部的)被函数b
使用; - 函数
a
返回(return
)函数b
为啥要用闭包,闭包的优缺点
计数器,顾名思义,就是每点击一次,就需要对应的变量自增一次,
那如果我们不用闭包的方式,怎么存储该变量呢?
那就需要定义一个全局变量
来实现自增!
当然现在流行的框架,如vue
,可以直接this.count++
即可;
或者呢命名空间啊,用对象包裹啥的也行,哈哈哈😄
那用闭包有什么缺点呢?
普通函数作用域内的变量,是在该函数执行结束后,其内部的变量就会被回收;
而闭包中的变量,如上述案例中的次数no
就会一直在内存中;
那如何回收闭包中的该变量呢?在合适的时机将变量置为null
即可
自执行函数
格式如:(function(){ })()
;立即执行且只执行一次;自执行函数一般可以和闭包配合使用。
在上述案例中,我们的目标是拿到闭包环境下的内部函数,外部函数只是为了产生闭包环境而临时定义的函数,所以...