變量,作用域

基本數據類型:(五種)

Undefined、 Null、Boolean、Number、String。

引用類型:

Object

異同:

       在複製的時候都會重新複製一個副本,然後再複製給其他變量

不同:

       對於基本數據的類型,複製後,參與任何操作不會受到影響,而引用類型的複製,引用類型的副本實際是一個指針,指向一個堆棧中的對象,當複製後,他們都同指向的同一個對象,所以改變其中一個的值,會影響另外一個的值

var obj1 = new Object;
	obj1.name = 'zl';
	var obj2 = obj1;
	obj2.age = 5;
	obj2.name ='zz';
	console.log(obj1);

作用域:

     塊級作用域

      首先明確一點,JavaScript不同於c/c++,它沒有塊級作用域,什麼叫塊級作用域呢,在這裏給大家舉個例子

var sum=0;
for(var i = 0; i< 10; i++)
   {
      sum+=i
   }
console.log(i);//i=10
     作用域鏈

      書上是這樣寫的,作用域是保證對執行環境有權訪問的所有變量和函數的有序訪問。,作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。全局執行環境的變量對象始終所示作用域鏈的最後一個對象。

     對於我來說,作用域鏈就是告訴了我,我可以訪問到哪些變量或者函數,而到底我能訪問到哪些變量和函數呢?這裏來給大家舉一個例子

 var color = 'red';
   function changeColor1 ()
	{
		color = "blur";
		return color;
	}
	function changColor2 ()
	{
		console.log(color);//undefined
		var color = 'yellow';
		return color;
	}
	console.log(color);//red
	console.log (changeColor1());//blue
	console.log(color);//blue
	console.log(changColor2());//yellow
	console.log(color);//blue

     可以發現的是①.尋找變量的時候,從自身作用域開始尋找,如果自身沒有,就往上找,這個上呢指的不是隨便什麼上面都可以,而是說必須是你的父級函數,或者再父級的父級。而不能往下去找,如果找不到,當然會是undefined。可是問題來了,爲什麼上面代碼中,第二個函數裏打印的是undefined?這裏又得提到一個東西,叫做變量的提升

變量的提升指的是 函數及變量的聲明都將被提升到函數的最頂部,其實在changeColor2中,雖然我們打印值放在了var color = 'yellow';的前面,但是進入函數並不是按順序執行的哦,他會先定義函數裏的變量,比如這裏的color會先被定義,然後賦初值爲undefined,而var color = 'yellow'只是將color進行新的賦值而已。當然變量的提升也只是一個較爲淺層次的說法,其實更深一步,我們得了解什麼叫預編譯
其實在腳本執行之前,我們的程序還經過了兩個步驟,一個是語法分析,還有一個就是我們說的預編譯。

語法分析是判斷你的基本語法是否出現錯誤,然後給出相應的出錯提示。

當程序開始運行使,頁面會創建一個全局對象(Global Object)預編譯在函數裏開始查找變量的聲明和函數的聲明,如果找了變量的聲明,那麼這個變量將作爲GO的屬性,初值爲undefined。而函數也將作爲GO的屬性,初值爲函數體。所以大家應該會理解以下代碼

 var color = 'red';
   function changeColor1 ()
	{       console.log(color);//undefined
		var color = "blur";
		console.log(color);//blur
	}
	function changeColor2 ()
	{
		var color = 'yellow';
		var color = function ()
		{
		}
		console.log(color)//ƒ (){}
	}
	changeColor1();
	changeColor2();





參考資料:JavaScript高級程序設計書 

發佈了30 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章