第二章 變量和做用域
在看第二章時我但願,你可以回想一下前一次所講的內容 假設有所遺忘
點這裏
今天咱們來講說 變量和做用域的問題
本章主要內容
- 基本類型和引用類型
- 運行環境
- 垃圾回收(瞭解就能夠)
基本類型和引用類型
JS中可能包括兩種不一樣的數據類型的值:
基本類型 和 引用類型 基本類型值 指的是簡單的數據段 而 引用類型指那些可能由多個值構成的對象。
怎樣定義基本類型值和引用類型值呢? 看如下
建立一個變量並給它賦值就OK了。
對於引用類型咱們可以加入 和刪除它的屬性和方法
var csdn = new Object();
csdn.blog = "Tomihaohao";
alert(csdn.blog) // Tomihaohao
var 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); //10
alert(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 詳細的使用方法也很是easy
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