补充:函数的实参为null的undefined的区别
function foo(arg1 = arg2, arg2) {
console.log(arg1)
console.log(arg2)
}
foo(undefined, 'qiaozhi')
function foo(arg1 = arg2, arg2) {
console.log(arg1)
console.log(arg2)
}
foo(null, 'qiaozhi')
闭包的理解
- 函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,并且需要在全局环境下使用内层函数,进而形成了闭包
闭包应用案例之点击按钮
<body>
<button>测试一</button>
<button>测试二</button>
<button>测试三</button>
</body>
<script>
var btns = document.getElementsByTagName('button')
for (var i = 0; i < btns.length; i++) {
var btn = btns[i]
btn.onclick = function () {
alert('第' + (i) + '个')
}
}
</script>
for (let i = 0; i < btns.length; i++) {
var btn = btns[i]
btn.index = i
btn.onclick = function () {
alert('第' + this.index + "个")
}
}
for (let i = 0; i < btns.length; i++) {
(function (i) {
var btn = btns[i]
btn.onclick = function () {
alert('第' + i + "个")
}
})(i)
}
常见的闭包
将函数作为另一个函数的返回值
function fun() {
var a = 10
function fun2() {
a++
console.log(a)
}
return fun2
}
var fun2 = fun();
fun2();
fun2();
fun2 = null
将函数作为实参传递给另外一个函数调用
function showMsgDelay(msg, time) {
setTimeout(function () {
console.log(msg)
}, time)
}
showMsgDelay('hello', 1000)
使用闭包实现私有方法操作独立的私有属性
闭包的原理
- 我们知道正常情况下外界是无法访问函数内部变量的,函数执行完之后,上下文即被销毁
- 但是在函数中,如果我们返回另一个函数,且该返回的函数使用了外层函数中的变量
- 那么外界就可以通过这个返回的函数获取原外层函数中的变量
闭包的应用
- 1.利用闭包实现“模块化”
- 2.redux源码的中间件实现机制
闭包的作用
- 1.延长外部函数变量对象的生命周期
- 2.让函数外部间接地操作(读写)到函数内部的数据(变量/函数)
- 3.注意:浏览器为了性能后期将外部函数中不被内部函数使用的变量清除了
闭包的生命周期
- 1.产生:内部的函数定义之后就立即产生闭包
- 2.死亡:内部函数成为垃圾对象时
闭包的优缺点
- 优点:延长外部函数变量对象的生命周期
- 缺点:延长外部函数变量对象的生命周期(会占用内存,如果不及时清除容易造成内存溢出,泄露)