ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* 定义:一个函数可以访问另一个函数内部的变量 * 形成条件 1. 一个函数(fn1)的返回值是另一个函数(fn2) 2. fn2中调用了fn1内部的变量 3. fn2在外部执行了 * * 作用 1. 实现封装过程。封装对象中的变量不能直接访问,提过返回的getter/setter方法来访问。 ``` function Person() { var name = '张三'; return { getName() { return this.name; }, setName(value) { this.name = value; } } } ``` 2. 模拟块级作用域 ``` function fn(num){ for(var i=0; i<num; i++){} console.log(i); } fn(2); //2 // 通过闭包模拟实现 function fn(num){ (function(){ for(var i=0; i<num; i++){} })(); console.log(i); } fn(2); //error "i is not defined" ``` 3. 解决for循环的问题 ``` function fn(){ for(var i=0; i<5; i++){ setTimeout(function(){ console.log(i); },i*1000); } } fn(); //每隔1s输出一次"5",共输出4次 //原因:i是var声明的变量,在函数范围内有效,每次for循环全局变量的i都会改变,所有每次输出的都是同一个i // 通过闭包解决 function fn(){ for(var i=0; i<5; i++){ (function(j){ setTimeout(function(){ console.log(j); },i*1000); })(i); } } fn(); //每隔1秒分别输出0 1 2 3 4 ```