摘要:二在中函數(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的胡扯一、JavaScript的內(nèi)存模型賦詩一首:
對(duì)象本無根,
類型亦無形。
本來無一物,
何處惹塵埃?
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
摘要:函數(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ù) ...
摘要:和,前者是過濾選擇器而后者是子代選擇器。第三章中的操作查找節(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...
摘要:運(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...
摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可...
閱讀 1605·2021-09-23 11:21
閱讀 2365·2021-09-07 10:13
閱讀 847·2021-09-02 10:19
閱讀 1143·2019-08-30 15:44
閱讀 1734·2019-08-30 13:18
閱讀 1921·2019-08-30 11:15
閱讀 1117·2019-08-29 17:17
閱讀 2026·2019-08-29 15:31