閉包是什麼
在 JavaScript 中,閉包是一個讓人很難理解的概念。 ECMAScript 中給閉包的定義是:閉包,指的是詞法表示包含不被計算的變數的函數,也就是說,函數可以使用函數之外定義的變數。
是不是看完這個定義感覺更懵逼了?別急,我們來分析一下。
閉包是一個函數
閉包可以使用在它外面定義的變數
#閉包存在定義該變數的作用域中
好像有點清晰了,但是使用在它外面定義的變數是什麼意思,我們先來看看變數作用域。
變數作用域
變數可分為全域變數和局部變數。全域變數的作用域就是全域性的,在 js 的任何地方都可以使用全域變數。在函數中使用 var 關鍵字聲明變量,這時的變量即是局部變量,它的作用域只在聲明該變量的函數內,在函數外面是訪問不到該變量的。
var func = function(){ var a = 'linxin'; console.log(a); // linxin}func();console.log(a); // Uncaught ReferenceError: a is not defined
作用域相對比較簡單,我們不多講,來看看跟閉包關係比較大的變數生存週期。
變數生存週期
全域變量,生命週期是永久的。局部變量,當定義該變數的函數呼叫結束時,該變數就會被垃圾回收機制回收而銷毀。再次呼叫函數時又會重新定義了一個新變數。
var func = function(){ var a = 'linxin'; console.log(a);}func();
a 為局部變量,在 func 調用完之後,a 就會被銷毀了。
var func = function(){ var a = 'linxin'; var func1 = function(){ a += ' a'; console.log(a); } return func1;}var func2 = func();func2(); // linxin afunc2(); // linxin a afunc2(); // linxin a a a
可以看出,在第一次調用完 func2 之後,func 中的變數 a 變成 'linxin a',而沒有被銷毀。因為此時 func1 形成了一個閉包,導致了 a 的生命週期延續了。
這下子閉包就比較明朗了。
閉包是一個函數,例如上面的 func1 函數
#閉包使用其他函數定義的變量,使其不被銷毀。例如上面 func1 呼叫了變數 a
閉包存在定義該變數的作用域中,變數 a 存在 func 的作用域中,那麼 func1 也必然存在這個作用域中。
現在可以說,滿足這三個條件的就是閉包了。
下面我們透過一個簡單又經典的例子來進一步熟悉閉包。
for (var i = 0; i < 4; i++) { setTimeout(function () { console.log(i) }, 0) }
我們可能會簡單的以為控制台會印出 0 1 2 3,但事實卻印出了 4 4 4 4,這又是為什麼呢?我們發現,setTimeout 函數時異步的,等到函數執行時,for迴圈已經結束了,此時的i 的值為4,所以function() { console.log(i) } 去找變數i,只能拿到4。
我們想起上一個例子中,閉包使 a 變數的值被保存起來了,那麼這裡我們也可以用閉包把 0 1 2 3 保存起來。
for (var i = 0; i < 4; i++) { (function (i) { setTimeout(function () { console.log(i) }, 0) })(i) }
當i=0 時,把0 作為參數傳進匿名函數中,此時function(i){} 此匿名函數中的i 的值為0 ,等到setTimeout 執行時順著外層去找i,這時就能拿到0。如此循環,就能拿到想要的 0 1 2 3。
記憶體管理
在閉包中呼叫局部變量,會導致這個局部變數無法及時被銷毀,相當於全域變數一樣會一直佔用記憶體。如果需要回收這些變數佔用的內存,可以手動將變數設為null。
然而在使用閉包的過程中,比較容易形成 JavaScript 物件和 DOM 物件的循環引用,就有可能造成記憶體外洩。這是因為瀏覽器的垃圾回收機制中,如果兩個物件之間形成了循環引用,那麼它們都無法被回收。
function func() { var test = document.getElementById('test'); test.onclick = function () { console.log('hello world'); } }
在上面範例中,func 函數中以匿名函數建立了一個閉包。變數 test 是 JavaScript 對象,引用了 id 為 test 的 DOM 對象,DOM 對象的 onclick 屬性又引用了閉包,而閉包又可以調用 test ,因而形成了循環引用,導致兩個對像都無法被回收。要解決這個問題,只需要把循環引用中的變數設為 null 即可。
function func() { var test = document.getElementById('test'); test.onclick = function () { console.log('hello world'); } test = null;}
如果在 func 函數中不使用匿名函數建立閉包,而是引用一個外部函數,也不會出現循環引用的問題。
function func() { var test = document.getElementById('test'); test.onclick = funcTest;}function funcTest(){ console.log('hello world'); }
以上是關於JavaScript中閉包的詳細解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能