什么是闭包
(一) 概念:闭包是指在 JavaScript 中,内部函数总 是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。(闭包是指有权访问另一个函数作用域中的变量的函数)
闭包的特点
(一) 使用闭包有一个优点,也是它的缺点:就是可 以把局部变量驻留在内存中,可以避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,所以推荐使用私有,封装的局部变量)。
闭包的原理 (一) 闭包就是定义在函数中的函数,是函数内外部 连接的桥梁。闭包的意义是:当前作用域总是能够访问外部作用域中的变量;函数是唯一拥有自身作用域的结构,所以闭包的创建依赖于函数。
五、闭包的应用场景
(一) 保护函数内的变量安全
(二) 在内存中维持一个变量。
(三) 通过闭包返回局部变量
(四) 使用全局变量进行累加和
(五) 使用局部变量进行累加和
(六) 循环里的匿名函数的取值问题
<script>
// function fn() {
// var a = 3;
// return function(){
// return a;
// }
// }
// (function () {
// var a = fn()(); //function(){return a;} 然后再调用函数块
// alert(a);
// })();
//使用全局变量进行累加和
// var a = 3;
// function fn(){
// a++;
// }
// fn();
// console.log(a); //4
// fn();
// console.log(a); //5
// fn();
// console.log(a); //6
// 使用局部变量进行累加和
// function fn() {
// var a = 3;
// return function(){
// return ++a;
// }
// }
// (function(){
// console.log(fn()()); //4
// console.log(fn()()); //4
// console.log(fn()()); //4
// })();
// function fn() {
// var a = 3;
// return function(){
// return ++a;
// }
// }
// (function(){
// var me = fn();
// console.log(me);
// console.log(me);
// console.log(me);
// //会输出三个function(){ return ++a;}
// })();
// function fn() {
// var a = 3;
// return function(){
// return ++a;
// }
// }
// (function(){
// var me = fn(); // var a = 3 function(){return ++a}
// console.log(me()); //4
// console.log(me()); //5
// console.log(me()); //6
// })();
// 循环里面的匿名函数的取值问题
// function fn() {
// var arr = [];
// for(var i = 0;i<5;i++){
// arr[i] = function(){
// return i;
// };
// }
// return arr;
// }
// (function(){
// var list = fn(); //arr
// for(var i = 0,len=list.length;i<len;i++){
// console.log(list[i]); // function(){return i}
// }
// })();
// function fn() {
// var arr = [];
// for(var i = 0;i<5;i++){
// arr[i] = function(){
// return i;
// };
// }
// return arr;
// }
// (function(){
// var list = fn(); //arr
// for(var i = 0,len=list.length;i<len;i++){
// console.log(list[i]()); //5个5
// }
// })();
// function fn() {
// var arr = [];
// for(var i = 0;i<5;i++){
// arr[i] = function(){
// return i;
// }(); //自调用 (i)给里面传不传i都是0 1 2 3 4 5
// }
// return arr;
// }
// (function(){
// var list = fn(); //arr
// for(var i = 0,len=list.length;i<len;i++){
// console.log(list[i]); // 0 1 2 3 4
// }
// })();
// function fn() {
// var arr = [];
// for(var i = 0;i<5;i++){
// arr[i] = function(i){
// return function(){
// return i
// };
// }(i);
// }
// return arr;
// }
// (function(){
// var list = fn(); //arr
// for(var i = 0,len=list.length;i<len;i++){
// console.log(list[i]); //五个函数块
// }
// })();
// function fn() {
// var arr = [];
// for(var i = 0;i<5;i++){
// arr[i] = function(i){
// return function(){
// return i
// };
// }(i);
// }
// return arr;
// }
// (function(){
// var list = fn(); //arr
// for(var i = 0,len=list.length;i<len;i++){
// console.log(list[i]()); //0 1 2 3 4
// }
// })();
/*
*闭包的原理: 利用了js中的垃圾回收机制,当一个函数调用结
* 束时,这个函数包括里面的局部变量都将会被垃圾回收机制进行回收释放,回收
* 过程中,如果发现局部变量正在被其他函数使用,则这各局部变量将不会被释
* 放,而是被永久保存在内存中,以供其他地方使用,所以只有当程序结束的时候
* 才会被释放,和全局变量一样,但不会像全局变量那样造成冲突,闭包会造成内
* 存泄漏。
*
*
*
*/
</script>