JavaScript學習

一直都有在頁面用javascript作爲腳本語言,但未從未深入瞭解,每當需要用到什麼功能的時候再查找相關事例,最近看了js框架感覺之前的瞭解明顯不夠。

一、原始值和對象
javascript中的原始值(undefined,null,數字、字符串和布爾值)和對象(包括數組和函數)有着根本的區別。原始值不可更改:任何方法都無法改變一個原始值。原始值的比較是值的比較。對象的屬性值可以改變,且對象的比較不是屬性值的比較。對象的比較是引用的比較,當且僅當它們引用的是同一個對象時比較才相等(對象可稱爲引用類型)。
數值、字符串和布爾值原始值有對應的包裝對象,當對原始值調用屬性時會自動調用其包裝對象準換爲臨時對象,並被用來處理屬性的引用。一旦屬性引用結束則銷燬臨時對象。而null和undefined無對應的包裝對象,故不能引用其屬性。
如:var test='test' //創建一個字符串
test.len=10; //設置對象屬性,會創建一個臨時字符串對象並設置屬性隨即銷燬
var t= test.len // 創建一個新的臨時字符串對象,嘗試讀取len屬性但不存在返回undefined

二、類型轉換
javascript中的取值非常靈活,將根據需要自動進行類型轉換。
"=="等於運算在判斷值相當時會自動轉換成同類型再比較。
"==="恆等運算在判斷相等時不做類型轉換
注意一個值轉換爲另一個值並不意味着兩個值相等,比如在期望布爾值的時候undefined會被轉換爲false。但並不表明undefined==false。"=="運算符從不試圖將操作數轉換爲布爾值。但是1==true 和0==false 都爲真。變量如果不爲-0,+0,null,undefined,false,都會被處理爲true。new Boolean(false)是一個對象會轉換爲ture。
+和==應用的是對象到原始值的轉換。
日期類型是javascript中唯一預先定義的類型,定義了有意義的向字符串和數值類型的轉換。對於所有非日期類型對象向原始值的轉換,基本上是對象到數值的轉換(首先調用valueOf())

三、作用域
javascript使用了函數作用域:變量在聲明它們的函數體及這個函數體嵌套的任意函數體內都是有定義的。且函數裏聲明的所有變量(不涉及賦值)都被提前至函數體的頂部,即聲明提前,在代碼運行之前的預編譯進行。函數體內的局部變量會覆蓋同名的全局變量。
除函數作用域外的變量均爲全局變量。當聲明一個全局變量時,實際上是定義了全局對象的一個屬性。當使用var聲明一個變量時,創建的這個屬性是不可配置的,也就是這個變量無法通過delete運算符刪除。如果沒有使用嚴格模式並給一個未聲明的變量賦值的話,會自動創建一個全局變量,以這種方式創建的變量是全局對象的正常的可配置屬性並可刪除。[測試都可刪除]
一般來說以下幾種情形擁有全局作用域:
1)最外層函數和在最外層函數外面定義的變量擁有全局作用域
2)所有末定義直接賦值的變量自動聲明爲擁有全局作用域
3)所有全局對象(如:window對象)的屬性擁有全局作用域

四、作用域鏈
在JavaScript中,函數也是對象。函數對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標準第三版定義,該內部屬性包含了函數被創建的作用域中對象的集合,這個集合被稱爲函數的作用域鏈,它決定了哪些數據能被函數訪問。

執行函數時會創建一個稱爲“運行期上下文(execution context)”的內部對象,運行期上下文定義了函數執行時的環境。每個運行期上下文都有自己的作用域鏈,用於標識符解析,當運行期上下文被創建時,而它的作用域鏈初始化爲當前運行函數的[[Scope]]所包含的對象。
什麼是執行環境呢?在javascript裏面執行環境分爲兩類,一類是全局環境,一類是局部環境,整個頁面裏被共享的方法和屬性就是在全局環境,相對於全局環境,函數{}號裏的執行環境就是局部環境,執行環境定義了變量或函數有權訪問的其他數據,決定了它們各自的行爲,每個執行環境都定義了一個與之相關的變量對象,環境中定義的所有變量和函數都保存在這個對象裏,雖然我們自己編寫的代碼無法訪問這個對象,但解析器在處理數據時候後臺會使用到它。
全局執行環境另一種說法是最外圍的一個執行環境,在web瀏覽器的範圍中(actionscript也是施行了ECMAScript標準,它的全局範圍就和javascript的全局範圍不同),全局執行環境被認爲是window對象,因此全局變量和函數都是作爲window對象的方法和屬性來創建的,全局執行環境知道應用程序退出比如關閉網頁或瀏覽器纔會被銷燬。而局部環境則是以函數對象作爲關聯對象。
每個執行環境都有一個與之關聯的變量對象(variable object, VO),執行環境中定義的所有變量和函數都會保存在這個對象中,解析器在處理數據的時候就會訪問這個內部對象。
全局執行環境是最外層的一個執行環境,在web瀏覽器中全局執行環境是window對象,因此所有全局變量和函數都是作爲window對象的屬性和放大創建的。每個函數都有自己的執行環境,當執行流進入一個函數的時候,函數的環境會被推入一個函數棧中,而在函數執行完畢後執行環境出棧並被銷燬,保存在其中的所有變量和函數定義隨之銷燬,控制權返回到之前的執行環境中,全局的執行環境在應用程序退出(瀏覽器關閉)纔會被銷燬。
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈(scope chain,不簡稱sc)來保證對執行環境有權訪問的變量和函數的有序訪問。作用域第一個對象始終是當前執行代碼所在環境的變量對象(VO)

function a(x,y){
var b=x+y;
return b;
}

在函數a創建的時候它的作用域鏈填入全局對象,全局對象中有所有全局變量
[img]http://images.cnitblog.com/blog/349217/201308/25155217-b9e8764deba34379bf858d8eaf967f08.png[/img]
儘量使用局部變量,就帶來一個十分重要的提高程序性能的用法:我們在函數內部使用全局變量可以說是一種跨作用域操作,如果某個跨作用域的值在函數的內部被使用到一次以上,那麼我們就把它存儲到局部變量裏。

五、原型
每一個對象都關聯一個原型對象並繼承其屬性(null除外),沒有原型的對象不多,Object.prototype就是其中之一。通過對象直接量創建的對象都具有同一個原型對象,並可通過Object.prototype獲得對原型對象的引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章