2020-3-3 前端達人
所謂閉包就是說,閉包是指有權訪問另外一個函數作用域中的變量的函數.可以理解為(能夠讀取其他函數內部變量的函數)
閉包的三大特點為(既是優點,也是缺點):
1,函數作用域空間不會被銷毀
優點是:空間中的內容,永遠存在
缺點是:占用大量的內存空間
2,可以從外部訪問函數內部的變量
優點是:使用變量數據方便
缺點是:容易泄露數據信息
3,保護私有作用域變量
優點是:確保私有作用域變量一直存在
缺點是:占用內存空間 閉包的最大問題是:有可能造成占用大量的內存空間,降低程序的執行效率,甚至有可能造成數據溢出或者是數據泄露 因為為了保護數據的安全性,特殊情況下,才會使用閉包舉例來說:
// 記數器:
//全局變量 全局變量降低函數的獨立性
1
// var count = 0;
// function add(){
// return count++;
// }
// console.log(add());
// console.log(add());
// console.log(add());
//局部變量 函數執行外 局部變量銷毀
1
// function add(){
// var count = 0;
// return count++;
// }
// console.log(add());
// console.log(add());
// console.log(add());
//plus定義在add的內部,可以訪問add局部變量count
//f為一個全局變量,通過賦值后,成為add的返回值,也就是plus方法
//訪問到了add中的局部變量count
//所以count雖然是局部變量,但不允許被銷毀,plus就是閉包
1
2
3
4
// function add(){
// var count = 0;
// function plus(){
// return count++;
// }
// return plus;
// }
//
// var f = add();
//
// console.log(f());
// console.log(f());
// console.log(f());
//變身
1
// function add(){
// var count = 0;
// return function(){
// return count++;
// }
// }
//
// var f = add();
//
// console.log(f());
// console.log(f());
// console.log(f());
//繼續變身
1
// var f = (function (){
// var count = 0;
// return function(){
// return count++;
// }
// }());
//
// console.log(f());
// console.log(f());
// console.log(f());
//JS中,沒有塊作用域,但是在閉包的寫法里,可以體現出來。
function outerFunc(){
var outVar = 10;
var innerF = function (){
var innerVar = 20;//該變量雖然隸屬于outerFunc內部,但是它的作用域范圍只在innerF對應的函數體內,屬于塊級作用域
}
alert(innerVar);
return innerF;
}
閉包的作用:
正常函數執行完畢后,里面聲明的變量被垃圾回收處理掉,但是閉包可以讓作用域里的 變量,在函數執行完之后依舊保持沒有被垃圾回收處理掉
可以讀取函數內部的變量
讓這些變量的值始終保持在內存中。
增加塊級作用域
總結:
1、 閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量。
2、 閉包的缺點就是常駐內存,會增大內存使用量,使用不當很容易造成內存泄露。
3、不必糾結到底怎樣才算閉包,其實你寫的每一個函數都算作閉包,即使是全局函數,你訪問函數外部的全局變量時,就是閉包的體現。
————————————————
版權聲明:本文為CSDN博主「澈野」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fie_ld/article/details/104595753