準備寫點亂七八糟的文章,對JavaScript的胡扯賦詩一首:javascript
對象本無根,java
類型亦無形。數組
原本無一物,瀏覽器
何處惹塵埃?函數
JavaScript的本質是一個對象,一個對象能夠包含多個屬性,對象的屬性能夠分爲直接量和對象兩種類型,而對象又分爲Object對象和function對象兩種類型。this
按照數據類型劃分:spa
簡單數據類型調試
特殊數據類型code
複雜數據類型對象
object
直接量和對象的兩種類型的屬性在內存中保存方式不一樣(跟Java中的相似)
對於對象類型的屬性來講,屬性名知識指向了保存對象的內存地址,而不是執行實際的對象,代碼演示以下:
function F(){ this.v = 1; } var f1 = new F(); var f2 = f1; console.log(f2.v); f2.v = 2; console.log(f1.v); f1 = null; console.log(f2.v);
代碼的執行圖解:
咱們一直都說JavaScript是腳本語言,在瀏覽器中解釋執行的,不該該有本身的內存模型,其實不是這樣的。不管編譯語言仍是解釋型語言,他們的變量、函數、對象等數據都是保存在內存當中的,使用時須要經過變量名在指定地方找到對應的具體內容,而後再進行實際操做。
函數咱們以前已經都接觸過了,函數無非有兩部分:數據和對數據的操做。數據有分爲外部數據和內部數據。對於外部數據咱們先不進行說明,這裏主要是說函數,內部數據有分爲參數和變量兩個部分。
參數(形參):在函數每次執行的時候參數都會被賦予一個新的數值;
變量(局部變量):每次都會設置爲一個相同的初始值;
函數的變量和參數是如何保存的呢?
函數在每次執行以前都會新建一個參數數組和一個變量數組(固然也能夠合併爲一個數組,而一般會使用棧來實現),而後將調用時所傳遞的參數設置到參數數組中,而變量數組在每次執行都具備相同的內容。簡單的數據會直接保存在數組當中,而複雜的數據,數組只是保存地址,具體的數據保存在堆中。
function paramTest(p1){ var message = "Hello World"; console.log(p1); for(var i in arguments){ console.log(arguments[i]); } } //函數的調用 paramTest("a","b","c"); //輸出結果爲: a a b c
咱們使用了Chrome的調試,函數在執行時會將參數p1和函數中所用到的變量messag、i方法相同的地位,即在函數內部執行的時候不會區分是參數仍是變量。在JS的函數中,會自動建立一個名字爲arguments
的內部變量,而後將全部的參數的地址保存到其中。arguments 相似數組對象,能夠經過它來獲取函數調用時所傳遞的參數。
paramTest方法首先打印了p1的值,而後遍歷打印arguments中全部的參數的值,能夠看出參數p1的值和arguments[0]的值是同樣的,函數的參數按照順序依次保存在arguments變量中,在調用函數時傳入參數的個數也能夠和定義時不同,因此說JS中不存在同名函數的重載方法。
在函數定義的變量時函數級做用域而不是塊級做用域
function scopeTest(){ if(true){ var message = "Hello World"; } console.log(message); } //函數的調用 scopeTest(); //輸出結果爲:Hello World
這裏的message是在if語句塊中定義的,可是在if語句外部依然能夠進行調用。
在JS中的方法執行時會將其自身全部使用var定義的變量統一放到前面介紹的變量數組當中,因此在一個函數中,全部使用var定義的變量都是同等地位的