胡扯JS系列-內(nèi)存模型和函數(shù)執(zhí)行

image

準(zhǔn)備寫點(diǎn)亂七八糟的文章,對JavaScript的胡扯

賦詩一首

對象本無根促煮,

類型亦無形邮屁。

本來無一物,

何處惹塵埃菠齿?

一佑吝、JavaScript的內(nèi)存模型

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

按照數(shù)據(jù)類型劃分:

  • 簡單數(shù)據(jù)類型
    • number
    • string
    • boolean
  • 特殊數(shù)據(jù)類型
    • null
    • undefined
  • 復(fù)雜數(shù)據(jù)類型
    • object
      • Object對象
      • function對象

直接量和對象的兩種類型的屬性在內(nèi)存中保存方式不同(跟Java中的類似)

  • 直接量:直接用兩塊內(nèi)存分別保存屬性名和屬性值

    image
  • 對象:需要三塊內(nèi)存疾棵,分別保存屬性名戈钢、屬性地址和屬性內(nèi)容

    image

對于對象類型的屬性來說,屬性名知識指向了保存對象的內(nèi)存地址陋桂,而不是執(zhí)行實(shí)際的對象逆趣,代碼演示如下:

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);

代碼的執(zhí)行圖解:

image

我們一直都說JavaScript是腳本語言,在瀏覽器中解釋執(zhí)行的嗜历,不應(yīng)該有自己的內(nèi)存模型,其實(shí)不是這樣的抖所。無論編譯語言還是解釋型語言梨州,他們的變量、函數(shù)田轧、對象等數(shù)據(jù)都是保存在內(nèi)存當(dāng)中的暴匠,使用時需要通過變量名在指定地方找到對應(yīng)的具體內(nèi)容,然后再進(jìn)行實(shí)際操作傻粘。

二每窖、在JS中函數(shù)是如何執(zhí)行的

函數(shù)我們之前已經(jīng)都接觸過了,函數(shù)無非有兩部分:數(shù)據(jù)和對數(shù)據(jù)的操作弦悉。數(shù)據(jù)有分為外部數(shù)據(jù)內(nèi)部數(shù)據(jù)窒典。對于外部數(shù)據(jù)我們先不進(jìn)行說明,這里主要是說函數(shù)稽莉,內(nèi)部數(shù)據(jù)有分為參數(shù)變量兩個部分瀑志。

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

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

  • 函數(shù)的變量和參數(shù)是如何保存的呢劈猪?

    函數(shù)在每次執(zhí)行之前都會新建一個參數(shù)數(shù)組和一個變量數(shù)組(當(dāng)然也可以合并為一個數(shù)組昧甘,而通常會使用棧來實(shí)現(xiàn)),然后將調(diào)用時所傳遞的參數(shù)設(shè)置到參數(shù)數(shù)組中战得,而變量數(shù)組在每次執(zhí)行都具有相同的內(nèi)容充边。簡單的數(shù)據(jù)會直接保存在數(shù)組當(dāng)中,而復(fù)雜的數(shù)據(jù)常侦,數(shù)組只是保存地址痛黎,具體的數(shù)據(jù)保存在堆中。

    image
    function paramTest(p1){
        var message = "Hello World";
        console.log(p1);
        for(var i in arguments){
            console.log(arguments[i]);
        }
    }
    //函數(shù)的調(diào)用
    paramTest("a","b","c");
    //輸出結(jié)果為: a a b c
    

    我們使用了Chrome的調(diào)試刮吧,函數(shù)在執(zhí)行時會將參數(shù)p1和函數(shù)中所用到的變量messag湖饱、i方法相同的地位,即在函數(shù)內(nèi)部執(zhí)行的時候不會區(qū)分是參數(shù)還是變量杀捻。在JS的函數(shù)中井厌,會自動創(chuàng)建一個名字為arguments的內(nèi)部變量,然后將所有的參數(shù)的地址保存到其中致讥。arguments 類似數(shù)組對象仅仆,可以通過它來獲取函數(shù)調(diào)用時所傳遞的參數(shù)。

    image

    paramTest方法首先打印了p1的值垢袱,然后遍歷打印arguments中所有的參數(shù)的值墓拜,可以看出參數(shù)p1的值和arguments[0]的值是一樣的,函數(shù)的參數(shù)按照順序依次保存在arguments變量中请契,在調(diào)用函數(shù)時傳入?yún)?shù)的個數(shù)也可以和定義時不一樣咳榜,所以說JS中不存在同名函數(shù)的重載方法。

  • 在函數(shù)定義的變量時函數(shù)級作用域而不是塊級作用域

    function scopeTest(){
        if(true){
            var message = "Hello World";
        }
        console.log(message);
    }
    //函數(shù)的調(diào)用
    scopeTest();
    //輸出結(jié)果為:Hello World
    

    這里的message是在if語句塊中定義的爽锥,但是在if語句外部依然可以進(jìn)行調(diào)用涌韩。

    在JS中的方法執(zhí)行時會將其自身所有使用var定義的變量統(tǒng)一放到前面介紹的變量數(shù)組當(dāng)中,所以在一個函數(shù)中氯夷,所有使用var定義的變量都是同等地位的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臣樱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腮考,更是在濱河造成了極大的恐慌雇毫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踩蔚,死亡現(xiàn)場離奇詭異棚放,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寂纪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門席吴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赌结,“玉大人,你說我怎么就攤上這事孝冒〖硪Γ” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵庄涡,是天一觀的道長量承。 經(jīng)常有香客問我,道長穴店,這世上最難降的妖魔是什么撕捍? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮泣洞,結(jié)果婚禮上忧风,老公的妹妹穿的比我還像新娘。我一直安慰自己球凰,他們只是感情好狮腿,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呕诉,像睡著了一般缘厢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甩挫,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天贴硫,我揣著相機(jī)與錄音倍奢,去河邊找鬼憾股。 笑死,一個胖子當(dāng)著我的面吹牛企蹭,可吹牛的內(nèi)容都是我干的删壮。 我是一名探鬼主播贪绘,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼央碟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起均函,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤亿虽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苞也,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洛勉,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年如迟,在試婚紗的時候發(fā)現(xiàn)自己被綠了收毫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攻走。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖此再,靈堂內(nèi)的尸體忽然破棺而出昔搂,到底是詐尸還是另有隱情,我是刑警寧澤输拇,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布摘符,位于F島的核電站,受9級特大地震影響策吠,放射性物質(zhì)發(fā)生泄漏逛裤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一猴抹、第九天 我趴在偏房一處隱蔽的房頂上張望带族。 院中可真熱鬧,春花似錦蟀给、人聲如沸蝙砌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拍霜。三九已至,卻和暖如春薪介,著一層夾襖步出監(jiān)牢的瞬間祠饺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工汁政, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留道偷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓记劈,卻偏偏與公主長得像勺鸦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子目木,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)和對象 1换途、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句刽射,而且...
    道無虛閱讀 4,586評論 0 5
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,132評論 0 21
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 借考察調(diào)研的時機(jī)军拟,再次來到了美麗的杭州,因平時有跑步的習(xí)慣誓禁,跑西湖的沖動立馬涌上心頭…… 肇慶...
    高洪昭閱讀 494評論 0 0
  • 游戲聯(lián)運(yùn)懈息、禮物贈送、會員收費(fèi)摹恰、廣告宣傳辫继,大致是這幾類了吧怒见。沒了游戲聯(lián)運(yùn)的盈利前景,目前其他幾項(xiàng)加起來感覺只是勉強(qiáng)補(bǔ)...
    missly117閱讀 111評論 0 0