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)