準備寫點亂七八糟的文章,對JavaScript的胡扯javascript
賦詩一首:java
對象本無根,數組
類型亦無形。瀏覽器
原本無一物,函數
何處惹塵埃?ui
JavaScript的本質是一個對象,一個對象能夠包含多個屬性,對象的屬性能夠分爲直接量和對象兩種類型,而對象又分爲Object對象和function對象兩種類型。this
按照數據類型劃分:spa
直接量和對象的兩種類型的屬性在內存中保存方式不一樣(跟Java中的相似)調試
直接量:直接用兩塊內存分別保存屬性名和屬性值code
對象:須要三塊內存,分別保存屬性名、屬性地址和屬性內容
對於對象類型的屬性來講,屬性名知識指向了保存對象的內存地址,而不是執行實際的對象,代碼演示以下:
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定義的變量都是同等地位的