JavaScript中的變量和閉包

JavaScript基礎


1.變量聲明

  JavaScript可以使用var顯式地聲明變量:

   var iNum;

 因爲JS是弱類型語言,即使變量的類型在初始化時已經被確定,也仍然可以之後把他設置成其他類型

  var sName = "ziqiu";

  alert(sName);

 sName=55;

  alert(sName);

 變量除了可以顯式聲明,也可以隱式聲明,就是不使用var關鍵詞聲明,而直接爲變量賦值

 隱式變量的作用域總是被創建爲全局變量。即使在一個函數中的變量也仍然是全局的。

 function test()

 {

  sName="ss";

}

test();

alert(sName);  //輸出ss

雖然sName是在函數中創建的,但是在函數外層仍然能夠訪問sName,因爲sName是全局變量。

2.變量的作用域與閉包

變量的作用域就是變量的作用範圍i,只有在變量的作用域內纔可以訪問該變量,否則是無法訪問此變量的。

functio test() {

var sName="ss";

}

alert(sName);  //輸出sName未定義

全局變量是Window對象的屬性。

隱式聲明的變量都是全局變量。說是"全局"但實際上還是有作用域的,即當前的Window對象。一個全局變量就是Window對象的一個屬性。

function test(){

sName = "ss";

test();

alert(sName);

alert(window.sName);

}

閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常爲一個函數),因而這些變量也是該表達式的一部分

簡單表述:

閉包就是function實例以及執行function實例時來自環境的變量。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>閉包舉例</title>
</head>
<body>
<div id="divResult">
</div>
<script type="text/JavaScript">
function start()
{
    var count=10;
	//設置定時器,每隔3秒鐘執行一次
	window.setInterval(function(){
	//定時器,每隔3秒鐘執行一次
	document.getElementById("divResult").innerHTML +=count +"</br>";
	count++;
	},3000);
};
start();
</script>	
</body>
</html>

count是start()函數體內的變量,按照通常的理解爲count的作用域是在start()函數內,在調用start()函數結束後應該也會消失。但是此示例的結果是count變來那個會一直存在,並每次被加1

這是因爲count變量是setInterval中創建的匿名函數(也就是包含count++的函數)的閉包的一部分!

再通俗地講,閉包首先就是函數本身,比如上面這個匿名函數本身,同時加上在這個函數運行時需要用到的count變量。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章