js閉包和函式自調

2021-09-13 16:57:18 字數 1525 閱讀 1071

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 該方法經常在全域性作用域中被用在函式外部,從而限制向全域性作用域中新增過多的...