成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

douzifly / 1528人閱讀

摘要:二在中函數(shù)是如何執(zhí)行的函數(shù)我們之前已經(jīng)都接觸過了,函數(shù)無非有兩部分?jǐn)?shù)據(jù)和對(duì)數(shù)據(jù)的操作。函數(shù)的調(diào)用輸出結(jié)果為我們使用了的調(diào)試,函數(shù)在執(zhí)行時(shí)會(huì)將參數(shù)和函數(shù)中所用到的變量方法相同的地位,即在函數(shù)內(nèi)部執(zhí)行的時(shí)候不會(huì)區(qū)分是參數(shù)還是變量。

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

賦詩一首

對(duì)象本無根,

類型亦無形。

本來無一物,

何處惹塵埃?

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

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

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

簡(jiǎn)單數(shù)據(jù)類型

number

string

boolean

特殊數(shù)據(jù)類型

null

undefined

復(fù)雜數(shù)據(jù)類型

object

Object對(duì)象

function對(duì)象

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

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

對(duì)象:需要三塊內(nèi)存,分別保存屬性名、屬性地址和屬性內(nèi)容

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

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í)行圖解:

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

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

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

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

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

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

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

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í)會(huì)將參數(shù)p1和函數(shù)中所用到的變量messag、i方法相同的地位,即在函數(shù)內(nèi)部執(zhí)行的時(shí)候不會(huì)區(qū)分是參數(shù)還是變量。在JS的函數(shù)中,會(huì)自動(dòng)創(chuàng)建一個(gè)名字為arguments的內(nèi)部變量,然后將所有的參數(shù)的地址保存到其中。arguments 類似數(shù)組對(duì)象,可以通過它來獲取函數(shù)調(diào)用時(shí)所傳遞的參數(shù)。

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

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

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í)行時(shí)會(huì)將其自身所有使用var定義的變量統(tǒng)一放到前面介紹的變量數(shù)組當(dāng)中,所以在一個(gè)函數(shù)中,所有使用var定義的變量都是同等地位的

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100779.html

相關(guān)文章

  • 胡扯JS系列-匿名函數(shù)的自動(dòng)運(yùn)行

    摘要:函數(shù)有很多種,我們就選擇我們不懂的函數(shù)開始學(xué)習(xí)中自動(dòng)運(yùn)行的匿名函數(shù)在中可以使用匿名函數(shù)在我們學(xué)習(xí)的時(shí)候也有類似的概念,匿名實(shí)現(xiàn)類,在中的函數(shù)也是一種對(duì)象,也是需要一塊內(nèi)存對(duì)其進(jìn)行保存。 showImg(https://segmentfault.com/img/remote/1460000017808564); 函數(shù)有很多種,我們就選擇我們不懂的函數(shù)開始學(xué)習(xí)! JS中自動(dòng)運(yùn)行的匿名函數(shù) ...

    馬龍駒 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)

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

    J4ck_Chan 評(píng)論0 收藏0
  • Emscripten教程之Emscripten的運(yùn)行時(shí)環(huán)境(二)

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

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

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

    keithyau 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<