国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

douzifly / 1522人閱讀

摘要:二在中函數是如何執行的函數我們之前已經都接觸過了,函數無非有兩部分數據和對數據的操作。函數的調用輸出結果為我們使用了的調試,函數在執行時會將參數和函數中所用到的變量方法相同的地位,即在函數內部執行的時候不會區分是參數還是變量。

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

賦詩一首

對象本無根,

類型亦無形。

本來無一物,

何處惹塵埃?

一、JavaScript的內存模型

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

按照數據類型劃分:

簡單數據類型

number

string

boolean

特殊數據類型

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是腳本語言,在瀏覽器中解釋執行的,不應該有自己的內存模型,其實不是這樣的。無論編譯語言還是解釋型語言,他們的變量、函數、對象等數據都是保存在內存當中的,使用時需要通過變量名在指定地方找到對應的具體內容,然后再進行實際操作。

二、在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定義的變量都是同等地位的

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100779.html

相關文章

  • 胡扯JS系列-匿名函數的自動運行

    摘要:函數有很多種,我們就選擇我們不懂的函數開始學習中自動運行的匿名函數在中可以使用匿名函數在我們學習的時候也有類似的概念,匿名實現類,在中的函數也是一種對象,也是需要一塊內存對其進行保存。 showImg(https://segmentfault.com/img/remote/1460000017808564); 函數有很多種,我們就選擇我們不懂的函數開始學習! JS中自動運行的匿名函數 ...

    馬龍駒 評論0 收藏0
  • JavaScript學習

    摘要:和,前者是過濾選擇器而后者是子代選擇器。第三章中的操作查找節點想要查找元素節點或者是屬性節點,就是通過前一章學習的選擇器獲取相應元素的文本,或者是通過選擇器屬性名獲取某元素相應屬性的值。 About Javscript record the thing which maybe forgetten 原生JavaScript Javascript DOM document.writ...

    J4ck_Chan 評論0 收藏0
  • Emscripten教程之Emscripten的運行時環境(二)

    摘要:運行時環境與大多數應用程序所期望的環境不同。不過程序是要手動交換緩沖區的。第一個主題介紹代碼可移植性與限制第二個主題介紹的運行時環境第三個主題第一篇文章介紹連接和第三個主題第二篇文章介紹第四個主題介紹文件和文件系統第六個主題介紹如何調試代碼 翻譯:云荒杯傾本文是Emscripten-WebAssembly專欄系列文章之一,更多文章請查看專欄。也可以去作者的博客閱讀文章。 Emscrip...

    VishKozus 評論0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享傳遞按值傳遞

    摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...

    keithyau 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<