變數作用域
- JavaScript是函式級作用域編程語言:變數只在其定義時所在的function內部有意義,
全域變數
- 如果不將變數定義在任何函式的內部,此時這個變數就是全域變數,它在任何函式內都可以被訪問和更改,
遮蔽效應
- 如果函式中也定義了和全域同名的變數,則函式內的變數會將全域的變數“遮蔽”,
注意考慮變數宣告提升的情況
- 這個程式的運行結果是什么呢?
形參也是區域變數
- 這個程式的運行結果是什么呢?
區域函式
- 先來認識函式的嵌套:一個函式內部也可以定義一個函式,和區域變數類似,定義在一個函式內部的函式是區域函式,
作用域鏈
- 在函式嵌套中,變數會從內到外逐層尋找它的定義,
不加var將定義全域變數
- 在初次給變數賦值時,如果沒有加var,則將定義全域變數,
什么是閉包
- JavaScript中函式會產生閉包(closure),閉包是函式本身和該函式宣告時所處的環境狀態的組合,
- 函式能夠“記憶住”其定義時所處的環境,即使函式不在其定義的環境中被呼叫,也能訪問定義時所處環境的變數,
觀察閉包現象
- 在JavaScript中,每次創建函式時都會創建閉包,
- 但是,閉包特性往往需要將函式“換一個地方”執行,才能被觀察出來,
閉包非常實用
- 閉包很有用,因為它允許我們將資料與操作該資料的函式關聯起來,這與“面向物件編程”有少許相似之處,
- 閉包的功能:記憶性、模擬私有變數,
閉包用途1 - 記憶性
- 當閉包產生時,函式所處環境的狀態會始終保持在記憶體中,不會在外層函式呼叫后被自動清除,這就是閉包的記憶性,
閉包的記憶性舉例
- 創建體溫檢測函式checkTemp(n),可以檢查體溫n是否正常,函式會回傳布林值,
- 但是,不同的小區有不同的體溫檢測標準,比如A小區體溫合格線是37.1℃,而B小區體溫合格線是37.3℃,應該怎么編程呢?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function createCheckTemp(standardTemp) {
function checkTemp(n) {
if (n <= standardTemp) {
console.log('你的體溫正常');
} else {
console.log('你的體溫偏高');
}
}
return checkTemp;
}
// 創建一個checkTemp函式,它以37.1度為標準線
var checkTemp_A = createCheckTemp(37.1);
// 再創建一個checkTemp函式,它以37.3度為標準線
var checkTemp_B = createCheckTemp(37.3);
checkTemp_A(37.2);
checkTemp_B(37.2);
</script>
</body>
</html>

閉包用途2 - 模擬私有變數
在Java、C++等語言中,有私有屬性的概念,但是JavaScript中只能用閉包來模擬,
- 題目:請定義一個變數a,要求是能保證這個a只能被進行指定操作(如加1、乘2),而不能進行其他操作,應該怎么編程呢?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 封裝一個函式,這個函式的功能就是私有化變數
function fun() {
// 定義一個區域變數a
var a = 0;
return {
getA: function () {
return a;
},
add: function () {
a++;
},
pow: function () {
a *= 2;
}
};
}
var obj = fun();
// 如果想在fun函式外面使用變數a,唯一的方法就是呼叫getA()方法
console.log(obj.getA());
// 想讓變數a進行加1操作
obj.add();
obj.add();
obj.add();
console.log(obj.getA());
obj.pow();
console.log(obj.getA());
</script>
</body>
</html>

使用閉包的注意點
- 不能濫用閉包,否則會造成網頁的性能問題,嚴重時可能導致記憶體泄露,
- 所謂記憶體泄漏是指程式中己動態分配的記憶體由于某種原因未釋放或無法釋放,
立即執行函式IIFE
- IIFE(Immediately Invoked Function Expression,立即呼叫函式運算式)是一種特殊的JavaScript函式寫法,一旦被定義,就立即被呼叫,
形成IIFE的方法
- 函式不能直接加圓括號被呼叫,
- 函式必須轉為“函式運算式”才能被呼叫,
IIFE的作用1 - 為變數賦值
- 為變數賦值:當給變數賦值需要一些較為復雜的計算時(如if陳述句),使用IIFE顯得語法更緊湊,
IIFE的作用2-將全域變數變為區域變數
- IIFE可以在一些場合(如for回圈中)將全域變數變為區域變數,語法顯得緊湊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/300759.html
標籤:其他
下一篇:vue3——自己封裝輪播圖效果

















