一、作用域
-
JavaScript作用域:分為全域作用域、區域作用域,變數在某個范圍內起作用和效果,目的是為了提高程式的可靠性和減少命名沖突,
-
變數的作用域:根據作用域的不同我們變數分為全域變數和區域變數,兩種變數其主要區別是函式內部可以直接讀取全域變數,但是在函式外部無法讀取函式內部的區域變數,
-
作用域鏈:
-
根據內部函式可以訪問外部函式變數的這種機制,用鏈式查找決定哪些資料能被內部函式訪問,就稱為作用域鏈,
-
只要是代碼,就至少有一個作用域,
-
寫在函式內部的區域作用域,
-
如果函式中還有函式,那么在這個作用域中就又可以誕生一個作用域,
-
1.全域變數
- 概念:在全域作用域下的變數,在全域下都可以使用,
- 如果在函式內部沒有宣告直接賦值的變數也屬于全域變數,
- 只有瀏覽器關閉的時,全域變數才會銷毀,比較占記憶體資源,
- 全域作用域:整個script標簽中,或者是一個單獨的js檔案,
2.區域變數
- 在區域作用域下變數,即在函式內部的變數就是區域變數,只能在函式內部使用,
- 函式的形參也可以看做是區域變數,
- 當我們程式執行完畢時,區域變數就會銷毀,比較節約記憶體資源,
- 區域作用域(函式作用域):在函式內部就是區域作用域,這個代碼的名字(變數)只在函式內部起作用和效果,
二、理解閉包
1.閉包的概念
- 閉包是指有權訪問另外一個函式作用域中的區域變數的函式,宣告在一個函式中的函式,叫做閉包函式,而且內部函式總是可以訪問其所在的外部函式中宣告的引數和變數,即使在其外部函式被回傳(壽命終結)了之后,
2.閉包的特點
- 讓外部訪問函式內部變數成為可能,
- 區域變數會常駐在記憶體中,
- 可以避免使用全域變數,防止全域變數污染,
- 會造成記憶體泄漏(有一塊記憶體空間被長期占用,而不被釋放),
3.閉包的分析
- 閉包就是可以創建一個獨立的環境,每個閉包里面的環境都是獨立的,并且互不干擾,
- 閉包會發生記憶體泄漏,每次外部函式執行的時候,外部函式的參考地址不同,都會重新創建一個新的地址,
- 但當外部函式運行結束甚至銷毀時,區域的變數key=value,盡管key被垃圾回識訓制給回收了,但是value仍不會被回收,會變成一個自由變數留下參考的指標,
4.閉包的實作案例
-
利用閉包的方式,輸出點擊項的索引值
<ul > <li>蘋果</li> <li>香蕉</li> <li>橘子</li> <li>西瓜</li> </ul> <script> // 獲取所有的li元素 let lis = document.querySelectorAll('.closure li') // 利用for回圈創建了4個立即執行函式 for (let i = 0; i < lis.length; i++) { (function (i) { lis[i].addEventListener('click', function () { console.log(i) }) })(i) } </script> -
利用閉包的方式,3秒鐘之后,列印所有li元素的內容
<ul > <li>蘋果</li> <li>香蕉</li> <li>橘子</li> <li>西瓜</li> </ul> <script> // 獲取所有的li元素 let lis = document.querySelectorAll('.closure li') for (let i = 0; i < lis.length; i++) { (function (i) { setTimeout(() => { console.log(lis[i].innerHTML) }, 3000) })(i) } </script>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/536043.html
標籤:JavaScript
