胡扯JS系列-內存模型和函數執行

準備寫點亂七八糟的文章,對JavaScript的胡扯

賦詩一首javascript

對象本無根,java

類型亦無形。數組

原本無一物,瀏覽器

何處惹塵埃?函數

1、JavaScript的內存模型

JavaScript的本質是一個對象,一個對象能夠包含多個屬性,對象的屬性能夠分爲直接量和對象兩種類型,而對象又分爲Object對象和function對象兩種類型。this

按照數據類型劃分:spa

  • 簡單數據類型調試

    • number
    • string
    • boolean
  • 特殊數據類型code

    • null
    • undefined
  • 複雜數據類型對象

    • object

      • Object對象
      • function對象

直接量和對象的兩種類型的屬性在內存中保存方式不一樣(跟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是腳本語言,在瀏覽器中解釋執行的,不該該有本身的內存模型,其實不是這樣的。不管編譯語言仍是解釋型語言,他們的變量、函數、對象等數據都是保存在內存當中的,使用時須要經過變量名在指定地方找到對應的具體內容,而後再進行實際操做。

2、在JS中函數是如何執行的

函數咱們以前已經都接觸過了,函數無非有兩部分:數據和對數據的操做。數據有分爲外部數據內部數據。對於外部數據咱們先不進行說明,這裏主要是說函數,內部數據有分爲參數變量兩個部分。

參數(形參):在函數每次執行的時候參數都會被賦予一個新的數值;

變量(局部變量):每次都會設置爲一個相同的初始值;

  • 函數的變量和參數是如何保存的呢?

    函數在每次執行以前都會新建一個參數數組和一個變量數組(固然也能夠合併爲一個數組,而一般會使用棧來實現),而後將調用時所傳遞的參數設置到參數數組中,而變量數組在每次執行都具備相同的內容。簡單的數據會直接保存在數組當中,而複雜的數據,數組只是保存地址,具體的數據保存在堆中。

    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定義的變量都是同等地位的
相關文章
相關標籤/搜索