js沒有c++中class的public和private的區分(es5中),只有全域性變數和區域性變數這兩種,引入閉包就使得js有了私有變數這一概念。
下面給出閉包的定義:閉包 是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的最常見的方式就是在乙個函式內建立另乙個函式,通過另乙個函式訪問這個函式的區域性變數。呼叫完一次後,函式沒有被釋放,整條作用域鏈上的區域性變數都將得到保留。
在本質上,閉包就是將函式內部和函式外部連線的一座橋梁。
寫乙個閉包的簡單例子:
function test() ;
}
var fun = test();
fun();// 1 執行後 a++,,然後a還在
fun();// 2
閉包有什麼好處呢?
1.希望乙個變數長期駐紮在記憶體中
2.避免全域性變數的汙染
3.私有成員的存在
我們使用全域性變數也可以實現同樣的效果
var a = 1;
function abc()
abc(); //2
abc(); //3
但是這樣全域性變數會變得很多很雜,對**的書寫不利
如果我們用區域性變數來寫的話 會遇到如下問題
function abc()
abc(); //2
abc(); //2
他的值沒有遞增
這時候我們就用到剛開始所說的閉包
function test() ;
}
var fun = test();
fun();// 1 執行後 a++,,然後a還在
fun();// 2
當然,也可以通過函式自調來實現
var fun = (function() ;
})();
fun(); //1
fun(); //2
簡單的說就是通過乙個」()」來將這個宣告變成乙個表示式,然後通過()直接呼叫前面的表示式。自我呼叫函式只執行一次。設定a為 1。並返回函式表示式。
下面讓我們舉乙個例項:
alert(b());相當於alert(box()()); 通過alert(b)我們可以看到b表示函式box()的內嵌function 所以b()也就是box()()呼叫了這個內嵌函式。
簡單的說,在執行b()時,就自動在box()這個函式中在執行,並且執行完後,區域性變數age並沒有消失,而是依然存在著,所以再次b()後age得到了遞增。
最後當我們不需要引用的時候直接b = null就可以了。
js函式 函式自呼叫 返回函式的函式 閉包
轉 什麼是函式 函式是重複計算使之簡化,修改常量方便。函式是數學中的抽象概念,我們看到乙個符號就知道其中的計算,100 n n 1 以上這個符號代表1到100的相加,看到它理解成加和,而不是很簡單的加法運算 我們可以省了複雜的計算過程,直接思考高層次的邏輯。函式是最基本的一種 抽象方式。首先需要清楚...
js 閉包和匿名函式
前面學了這麼多知識,今天就來看看匿名函式和閉包吧!想要學習閉包先來看看什麼是匿名函式吧!一 匿名函式 匿名函式就是沒有名字的函式。他有兩種宣告方式 1.典型的函式宣告 function functionname arg0,arg1,arg2 2.函式表示式 var functionname func...
js函式閉包
閉包的好處 希望乙個變數長期駐紮在記憶體當中 避免全域性變數的汙染 私有成員的存在 舉例 function f1 x var b f1 2 x 2 b 10 相當於b f2 b f2 故y 10 匿名函式 function 該方法經常在全域性作用域中被用在函式外部,從而限制向全域性作用域中新增過多的...