閉包與私有變數

2022-07-16 17:09:16 字數 1692 閱讀 2537

看了高程之後知道閉包可以用於建立私有變數,但是對於私有變數仍然不是很懂,後來看了單頁web應用這本書之後,對於私有變數有了更深入的理解,這裡小小總結一下。

閉包這裡就不多囉嗦了,相信大家都有一定的了解了,可以理解成a函式裡面套了乙個b函式,而b函式可以訪問到a函式裡面的變數

其實除了私有變數之外相應的也就有私有函式和公有函式,下面會放在一起講

用乙個的例子來說明更為明顯:

<

body

>

<

button

id="btn"

>加1

button

>

<

script

>

varfn

=function

(); getnumber

=function

(); addnumber

=function

(); init

=function

(); };

return

; };

varf

=fn();

script

>

body

>

首先四個函式都使用了閉包,所以他們都可以訪問到f的私有變數a,其中getnum和init是公有函式,addnum和setnumber是私有函式

我們先來看一下測試的結果:

可以看到一開始a的值是沒有賦值的,所以f.getnum()得到的undefined

經過初始化之後,a的值被賦為了1,同時我們還繫結的點選事件

再次執行f.getnum()我們獲得了a的值

點選三次按鈕之後a的值變為了4

再次執行f.getnum()進行驗證,發現a的值的確變成了4.。

為什麼說a是私有變數呢?因為你無法從外界訪問到變數a,但是這也太常見了,只要是個函式就都會有私有變數,有什麼稀奇的,嗯,所以我認為主要還是公有函式和私有函式起著更大的作用

同理,因為函式是私有的,所以你沒有辦法直接訪問到它,也就沒有辦法從外部來修改它,它可以去執行某些操作,但想要它起作用就要通過公有函式來呼叫它

如上述**所示我們最後return 出來的就是公有函式,它是可以通過外界來直接呼叫的函式,你可以選擇在return裡面放哪些函式。比如這裡我不希望別人直接來改我的私有變數的值,我就可以選擇不把setnumber放進來,你想改變a的值就只能去乙個乙個的點按鈕。

通過呼叫公有函式我們可以去訪問或改變私有變數的值,也可以去呼叫私有函式,比如這裡我們通過getnumber訪問到了a的值,又通過init初始化了a的值同時繫結了點選事件,使得每一次點選按鈕的時候我們都可以呼叫addnumber這個私有函式。

在這個過程中,因為fn返回了乙個物件,物件中包含著內部的函式,並且這個函式還訪問了內部的變數,導致f的整個變數物件一直被儲存在記憶體之中,所以其中的私有變數,私有函式我們都還可以訪問到。

閉包與變數

js高程中關於閉包與變數這一節,講到乙個案例,我當時看的一臉懵逼,然後就自習的研究了一下,先上 function createfunctions return result 呼叫最外層函式,接收返回的陣列 var arr createfunctions 迴圈遍歷陣列,呼叫每個元素並列印 for va...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中的任何變數的最後乙個值。別忘了閉包所儲存的時整個變數物件,而不是某個特殊的變數。下面這個例子可以清晰地說明這個問題 function createfunction return result 這個函式返回的函式陣列中,所有函式的內部...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數。function createfunctions return result 上述函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置0...