js闭包函数
一. 匿名函数
javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域百,避免产生全局变量,影响整体页面环境,增加代码的兼容性。
(function(){})是一个标准的函数定义,但是没有复制给任何变量。所以是没有名字的函数,叫匿名函数。没有名字就度无法像普通函数那样随时随地调用了,所以在他定义完知成后就马上调用他,后面的括号()是运行这个函数的意思
二. 闭包示例
1. 首先立即执行匿名函数获得闭包函数,此时闭包函数可以拿到上一层函数的变量保证不被销毁
2. 此时counter就类似私有变量,只能通过闭包函数进行修改
3. 缺点大量内存占用,导致局部变量不会被垃圾回收,严重会导致内存泄漏(内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果)
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add(); // 计数器为 3
4. 经典面试题,循环中使用闭包解决 var
定义函数的问题
首先因为 setTimeout
是个异步函数,所有会先把循环全部执行完毕,这时候 i
就是 6 了,所以会输出一堆 6。
for ( var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); }
5. 还可以使用 let
定义 i
解决此问题,因为对于 let
来说,他会创建一个块级作用域
for ( let i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); }