1. 程式人生 > >JavaScript——區域性函式與函式獨立性的理解

JavaScript——區域性函式與函式獨立性的理解

我們都知道,在JavaScript中,在函式內使用var定義的是區域性變數,在函式內沒有使用var定義的或者在函式外定義的則是全域性變數。如果區域性變數和全域性變數的變數名字相同,那麼區域性變數會覆蓋全域性變數。全域性變數只能在函式中訪問,而全域性變數可以在所有的函式中訪問。

其實,除了區域性變數,還有一個概念叫做區域性函式。

什麼叫佈局函式呢?它與區域性變數類似,其實就是在一個函式中定義的函式。如下面這段程式碼:

<script type="text/javascript">
	// 定義全域性函式
	function outer()
	{
		// 定義第一個區域性函式
		function inner1()
		{
			document.write("區域性函式11111<br />");
		}
		// 定義第二個區域性函式
		function inner2()
		{
			document.write("區域性函式22222<br />");  
		}
		document.write("開始測試區域性函式...<br />");
		// 在函式中呼叫第一個區域性函式
		inner1();
		// 在函式中呼叫第二個區域性函式
		inner2();
		document.write("結束測試區域性函式...<br />");
	}
	document.write("呼叫outer之前...<br />");
	// 呼叫全域性函式
	outer();
	document.write("呼叫outer之後...<br />");
</script>

在上面的函式中,outer函式定義了兩個區域性函式:inner1和inner2,並在outer函式內呼叫了這兩個區域性函式。因為這兩個函式是在outer內定義的,因此可以在outer內訪問它,無法在外部訪問他們,也就是說,只有在outer函式內部這兩個函式才有效。

那假如將上面的程式修改一下,在outer增加對inner1的呼叫,會怎麼樣呢?

<script type="text/javascript">
	//定義全域性函式
	function outer()
	{
		//定義第一個區域性函式
		function inner1()
		{
			document.write("區域性函式11111<br />");
		}
		//定義第二個區域性函式
		function inner2()
		{
			document.write("區域性函式22222<br />");  
		}
		document.write("開始測試區域性函式...<br />");
		//在瀏覽器中呼叫第一個區域性函式
		inner1();
		//在瀏覽器中呼叫第二個區域性函式
		inner2();
		document.write("結束測試區域性函式...<br />");
	}
	document.write("呼叫outer之前...<br />");
	//呼叫全域性函式
	outer();
	//在外部函式之外的地方呼叫區域性函式
	inner1();
	document.write("呼叫outer之後...<br />");
</script>

執行的時候控制檯會報錯:

到這裡大家也就該明白區域性函式的特性了:區域性函式的作用域是所在的函式,如果在外部呼叫,那麼會出錯。

但是,如果有學過函式獨立性的夥伴這時候可能會有疑問。

因為在函式獨立性中有說道:“當使用內嵌函式定義某個類的方法的時候,該內嵌函式也是獨立存在的,而不是作為該類例項的附庸存在,這些內嵌函式也可以被分離出來獨立使用。”

這句話中說“內嵌函式可以被分離出來獨立使用”,那按它這麼說,豈不是和上面的區域性函式的定義衝突了嗎?區域性函式說不能在外部被呼叫,可這裡又說可以被分離出來獨立使用,這到底是怎麼回事呢?

我們先來看一段程式碼:

<script type="text/javascript">
	function Person(name)
	{
		this.name = name;
		// 定義一個info方法
		this.info = function()
		{
			alert("我的name是:" + this.name);
		}
	}
	var p = new Person("Searchin");
	// 呼叫p物件的info方法
	p.info();
	var name = "測試名稱";
	// 以window物件作為呼叫者來呼叫p物件的info方法
	p.info.call(window);
</script>

程式執行將彈出兩個彈框。

通過上面的操作我們可以看到,info方法被呼叫了兩次,一次是被p呼叫,一次則是被window呼叫。

這裡是不是就違背了之前說的區域性函式在外部呼叫無效呢?

其實沒有違背。我們來看一下呼叫語句

    p.info();
	var name = "測試名稱";
	// 以window物件作為呼叫者來呼叫p物件的info方法
	p.info.call(window);

第一個呼叫是直接p呼叫類內方法,這個沒有問題,重點在第二個呼叫。

它是通過call方法以window物件作為呼叫者來呼叫物件info的方法,這種操作實際上還是在藉助p來呼叫了info方法,換句話說,window想要呼叫info方法,但是沒有辦法直接呼叫,於是它找到info方法的主人,讓它作為中間人,幫忙呼叫,從而達到自己的目的。

所以說,雖然它可以被分離出來獨立使用,但還是得藉助p的幫助,這即展示了局部函式的獨立性,也沒有違背區域性函式的特性。

好啦,以上是個人對區域性函式和函式獨立性的理解,如果大家有什麼疑問或者有更好的見解,歡迎留言評論,大家一起學習呀。