了解js中的全局變量和局部變量
全局變量屬于 window 對象,局部變量只能用于定義它函數(shù)內(nèi)部。當全局和局部變量名稱相同,它們也是兩個不同的變量,值是互不影響的。
列子:
<!DOCTYPE html>
<html>
<head>
? ? <meta charset='utf-8'>
? ? <meta http-equiv='X-UA-Compatible' content='IE=edge'>
? ? <title>測試</title>
? ? <meta name='viewport' content='width=device-width, initial-scale=1'>
<body>
? ? <p>測試</p>
</body>
<script>
? ? var a=2//全局變量a
? ? function test(){
? ? ? ? var a =1//局部變量a
? ? ? ? console.log(a)
? ? }
? ? test();
? ? function outPutA(){
? ? ? ? console.log(a)
? ? }
? ? outPutA();
</script>
</html>
上面代碼結(jié)果:

當變量聲明時不使用var關(guān)鍵字,那么它就變成了一個全局變量,即便它在函數(shù)內(nèi)定義。上面代碼test()里這樣聲明變量
a=3;
那么控制臺就輸出兩個3,因為先執(zhí)行了test(),全局變量a重新賦值為3;
所以全局變量的作用域是全局性的,即在整個JavaScript程序中,全局變量在每一個函數(shù)內(nèi)都能訪問。
函數(shù)內(nèi)部聲明的變量即局部變量,只能在函數(shù)內(nèi)部起作用,作用域是局部性的;函數(shù)的參數(shù)也是局部性的,只在函數(shù)內(nèi)部起作用。
那么閉包是什么?
閉包是一種保護私有變量的機制,在函數(shù)執(zhí)行時形成私有的作用域,保護里面的私有變量不受外界干擾。
列子:
var add = (function () {
? ? var counter = 0;
? ? return function () {return counter += 1;}
})();
? ? for(var i = 0;i<4;i++){
? ? ? ? console.log(add())
? ? }
控制臺輸出1,2,3,4
假如在add()外部重新給counter賦值,
var add = (function () {
? ? var counter = 0;
? ? return function () {return counter += 1;}
})();
??? var counter =3;
? ? for(var i = 0;i<4;i++){
? ? ? ? console.log(add())
? ? }
控制臺仍然輸出1,2,3,4
所以閉包就將函數(shù)里面的變量保護起來,外部代碼不能訪問到函數(shù)內(nèi)部的私有變量,只能通過add()函數(shù)改變counter的值。