標籤:blog http color java io strong 資料 for
第二章 變數和範圍 在看第二章時我希望,你可以回顧一下前一次所講的內容 如果有所遺忘 點這裡
今天我們來說說 變數和範圍的問題
本章主要內容
- 基本類型和參考型別
- 執行環境
- 記憶體回收(瞭解即可)
基本類型和參考型別JS中可能包含兩種不同的資料類型的值:
基本類型 和 參考型別 基本類型值 指的是簡單的資料區段 而 參考型別指那些可能由多個值構成的對象。
如何定義基本類型值和參考型別值呢? 看下面
建立一個變數並給它賦值就OK了。 對於參考型別我們可以添加 和刪除它的屬性和方法
var csdn = new Object();csdn.blog = "Tomihaohao";alert(csdn.blog) // Tomihaohaovar name ="csdn";name.age = 123;alert(name.age) //undefined//同樣的一段方式的代碼為什麼 結果不一樣呢?
在JS中只能給參考型別的值添加動態屬性
我們在看一段代碼
var a =1;var b = a;alert(b);//-------------------------------------var obj1 = new Object();var obj2 = obj1;obj1.name = "csdn";alert(obj2.name) //"csdn"//知道上面兩段代碼在解析器裡發生什麼了嗎?
兩張圖幫你解釋清楚
傳遞參數:
還記得上一章講的函數的參數嗎? 我們來回顧一下JS 中的函數 參數是很靈活的,還記得arguments[] 嗎? 如果你忘記了 點擊這裡
今天我要在來說一說JS中的參數
請記住
JS 中函數的參數都是按值傳遞的
還記得我上面畫的圖嗎? 是的 把函數外部的值複製給函數內部的參數,就和把值從一個變數複製到另一個變數一樣
function addnum(param){ num +=10; return num;}var a = 10;var b = addnum(a);alert(a); //10alert(b); //20//看 他們兩個是互不影響的
有人可能會疑問 拿要是參考型別還是這樣嗎?
function setObj(obj){ obj.name = "csdn"; obj = new Object(); obj.name = "Tomihaohao"}var T = new Object();setObj(T);alert(T.name);//是什麼呢? 沒錯依然是csdn //實際上這個局部對象,在函數執行完後就被kill了
新的工具 instanceof
記得上一章給大家介紹了一個 type of sth 對 就是 typeof 這個工具
但是 如果你遇到了參考型別又該怎麼辦呢?因為typeof 返回的都是object.
這裡給大家介紹 instanceof 具體的用法也很簡單
var person = []alert(person instanceof Array)//person 是 Array對象嗎? 當然是!
執行環境和範圍在javascript 中最重要的一個概念:執行環境!
- 執行環境定義了變數和函數有權訪問的其他資料,決定了它們各自的行為
- 每個執行環境都有一個與之關聯的 變數對象
- 在瀏覽器中 window 對象是全域執行環境,它們只有在應用退出時才能銷毀
- 每個函數都有自己的執行環境
- 代碼在一個環境執行時,會建立物件變數的一個範圍
- 標識符解析是沿著範圍一級一級的搜尋標識符的過程
var color = "white";function changeColor(){ var anotherColor = "red"; function swapColors(){ var tempColor = anotherColor; anotherColor = color; color = tempColor; //這裡可以訪問 color anotherColor tempColor}swaoColors();//這裡可以訪問color anotherColor}changeColor();//只能訪問到color
上面的代碼一共有三個執行環境,分別是全域環境 changeColor() 局部環境 swapColors() 局部環境,全域環境中有一個變數 color 而在 changeColor()中 有 anotherColor這個變數和 swapColors()這個函數,在swapColors()中有一個tempColor,至於為什麼有的地方訪問不到呢?
範圍鏈就是,內部環境可以通過它去訪問所有外部環境,但反過來確實不行的,每個環境都可以向上搜尋範圍鏈,來查詢變數和函數,但是他們不能向下搜尋
記住JS中沒有塊級範圍
javascript 和 C JAVA C#不一樣他是沒有自己的塊級範圍的,當然你可以通過一些方法來類比,這個我們後面會講到。
for(var i =0 ;i<10;i++){ console.log(i);}alert(i); //i=10
如果是JAVA 那麼變數i會被立即銷毀,但在JS中呢!依然存在
js 中查詢標識符
var color ="blue";function getColor(){ //var volor ="red"; return color;}alert(getColor()) //blue//如果去掉 getColor()中的注釋 那麼返回的就是red
沒錯,在js中 標識符會沿著範圍逐級的網上搜尋,直到找到為止
瀏覽器中的GC 記憶體回收其實這裡大家只要知道一個概念就行了,那就是 解除引用。
一旦資料不再有用,最好將其設定為null來釋放其引用
//向這樣var a ="csdn ";//沒用啦a = null//解除引用
總結
- 從一個變數複製到另一個變數的 具體過程,會建立這個值的副本
- 參考型別的值是對象,儲存在堆記憶體中
- 參考型別值的變數其實是一個指標
- 參考型別的複製實質上是複製了一個指標他們同時指向同一個對象
- 學習了新的工具instanceof
- 學習了範圍鏈
- 瞭解了GC