首頁 web前端 js教程 詳解Javascript中的閉包

詳解Javascript中的閉包

Mar 12, 2017 am 11:22 AM

這篇文章詳解Javascript中的閉包

#一、閉包! ?

  閉包(closure)是Javascript語言的一個困難,對於初學者來說不容易理解,那我們先來看看閉包的意思。

  百度百科與“官方”解釋:#所謂“閉包”,指的是一個擁有許多變量和綁定了這些變數的環境的表達式(通常是一個函數),因而這些變數也是該表達式的一部分。

  維基百科:在程式語言中,閉包(也稱為詞法閉包或函數閉包)是用於在具有第一類函數的語言中實作詞法範圍名稱綁定的技術。

  然而我們看到這些官方的解釋並不能很清楚的了解閉包到底是什麼鬼東西,只會一頭問號,「你在說什麼?

  其實閉包簡單來講就是能夠讀取函數內部定義的局部變數的函數,而在Javascript中只有函數內部的子函數才能讀取局部變量,所以我們也可以把閉包理解成定義在函數內部的函數。

二、函數的變數

  想要理解閉包,我們就先要了解在函數中的變量,這些變數有自己的作用域。什麼是作用域?吶,通常來說,一段程式碼中所用到的名字並不總是有效/可用的,而限定這個名字的可用性的代碼範圍就是這個名字的作用域。

  變數的作用域有兩種,一個是全域,一個是局部,也就是我們所說的全域變數和局部變數。   


var a=50;function fun1(){
    alert(a);
}
fun();
登入後複製


  上面這段程式碼中,a在函數外定義,所以在函數內部呼叫變數a自然可以讀取它的值。這裡的a我們就叫它全域變數。


function fun2(){
    var a=50;
}
alert(a);
登入後複製


  而在這段程式碼中,我們把a定義在函數內部,那麼在函數外部呼叫a的時候,它會報錯,告訴你“a  is not defined”,我們找不到a啊?我們定義過a嗎?當然定義過啊!只不過它是局部變數而已。

三、如何找到「藏」在函數裡的變數

  在我們敲鍵盤碼程式碼的時候,總是會有一些原因,需要我們得到函數內部的局部變量,那麼「藏」在函數裡的局部變數我們就需要用一種方法把他提取出來。

  那就是在函數內部,我們再定義一個函數。


function fun3(){
    var a=50;
    function fun4(){
        return a;
    }
    return fun4();
}
//console.log(a); 报错
console.log(fun3());
登入後複製


  在上面這段程式碼裡,我們在fun3裡面定義了一個變數a,這樣我們在函數fun3外呼叫a同樣會報錯找不到它,而對於函數fun3內部的函數fun4來說,a是可以調用的,因外a在函數fun4的外部,反過來fun4內如果定義了一個變數那麼fun3是不可調用的。

  這裡就又涉及到另一個概念,就是鍊式作用域,也就是我們所說的作用域鏈。 作用域鏈就是相同的變數名稱會產生作用域鏈,存取該變數名稱的時候,會先找本層作用域是否含有該變量,如果沒有就去父層作用域去找,最終找到全域變數為止,如果全域變數也找不到該變量,那麼就會報錯。

  那麼如果想在函數fun3外面呼叫變數a,就要在函數fun3內部再定義一個函數fun4,我們讓它回傳他可以呼叫的變數a,那麼函數fun4的結果就是變數a,那麼我們再回傳函數fun4,那我們執行函數fun3,得到的結果就是變數a的值。

  簡單來講,就是只要把fun4當作回傳值,我們就可以在fun3外部讀取它的內部變數了。

四、呼叫局部變數(使用閉包)要注意什麼?

  1.閉包會使函數裡面的變數被保存在記憶體中,對於記憶體的消耗非常大,所以不能濫用閉包,否則網頁的效能會降低。

  2.不要隨便改變父函數內部變數的值。


  最後總結一下,閉包就是能夠讀取其他函數內部變數的函數,能夠讓我們在父級函數外呼叫父級函數內的變量,有程式碼的情況下理解起來其實不難,重要的是在變化莫測的程式碼中,閉包具體的應用還是需要我們真正的理解它才可以熟練應用。

 

 


#

以上是詳解Javascript中的閉包的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles