1. 闭包
定义:一个函数可以访问另一个函数内部的变量
形成条件
- 一个函数(fn1)的返回值是另一个函数(fn2)
- fn2中调用了fn1内部的变量
- fn2在外部执行了
- 作用
- 实现封装过程。封装对象中的变量不能直接访问,提过返回的getter/setter方法来访问。
function Person() {var name = '张三';return {getName() {return this.name;},setName(value) {this.name = value;}}}
- 模拟块级作用域
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"
- 解决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
