Day02-JS高级编程
一、闭包(扩展)
概念:闭包指的就是在子函数中,可以访问父级函数中的变量。闭包形成的条件,需要在一个函数中嵌套一个子函数,内部函数访问外部函数的变量。
案例1-闭包的基础
/**
* 函数声明
*/
function fun(){
var name = "hello"
return function(){
console.log(name);
}
}
//外部函数调用,外部函数执行完后,函数的代码会从栈内存中销毁
let fun2 = fun()
// console.log(fun2);
//调用子函数
fun2()
fun()调用完成后,fun这个函数会从内存中清除。
变量name会存放在闭包空间里面。
当调用内部函数fun2(),name使用完,闭包空间里面对应name消失
案例2
如下代码输出的结果都是一样的
<script>
/**
* 页面打开,for循环会立马执行,会创建5个延时器
* 延时器在定时时间到了才会执行
*
* 循环执行完后,i的值已经是5了,又过了5秒延时器开始执行,延时器要输出变量i,会输出变量i的最终结果
*/
for(var i=0;i<5;i++){
setTimeout(() => {
console.log("-------",i);
}, 5000);
}
</script>
使用闭包解决这个问题
<script>
/**
* 页面打开,for循环会立马执行,会创建5个延时器
* 延时器在定时时间到了才会执行
*
* 循环执行完后,i的值已经是5了,又过了5秒延时器开始执行,延时器要输出变量i,会输出变量i的最终结果
*/
for(var i=0;i<5;i++){
//立即执行函数作为父级函数,index是父级函数的变量
(function(index){
//延时器中的函数作为子函数,
setTimeout(() => {
console.log("-------",index);
}, 5000);
})(i)