JavaScript - 變量、作用域和內(nèi)存問題

變量:

1、基本類型

指簡單的數(shù)據(jù)段,源自以下5種:

基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中

  • Undefined
  • Null
  • Boolean
  • Number
  • String

提示:不允許給基本類型添加屬性(盡管這樣做不會(huì)導(dǎo)致任何錯(cuò)誤):

var name = ‘Bert’;
name.age = 27;
alert(name.age); //undefined

<span>

Paste_Image.png

</span>

說明:只能給引用類型值動(dòng)態(tài)地添加屬性,以便將來使用。

var num1 = 5; var num2 = num1;

num1中保存的值是5。當(dāng)使用num1的值來初始化num2是,num2中也保存了值5.但num2中的5與num1中的5是完全獨(dú)立的,該值知識(shí)num1中5的一個(gè)副本。

基本類型的賦值是拷貝一份副本給另一個(gè)變量,兩個(gè)變量參與任何操作不會(huì)相互影響。

2、引用類型

指那些可能由多個(gè)值構(gòu)成的對(duì)象

注意:引用類型的值是保存在內(nèi)存中的對(duì)象。與其他語言不同,JavaScript不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用(內(nèi)存地址)而不是實(shí)際的對(duì)象。為此,引用類型的值是按引用訪問的。

引用類型的賦值:

引用變量間的復(fù)制操作,也是將存儲(chǔ)在變量對(duì)象中的值復(fù)制一份放到新變量中,不同的是這類值是指針(內(nèi)存中的一段地址),這個(gè)指針指向存儲(chǔ)在推中的一個(gè)對(duì)象。

復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。因此,改變其中一個(gè)變量,就會(huì)影響另一個(gè)變量。

var obj1 = new Object();
var obk2 = obj1;
obj1.name = "Bert";
alert(obj2.name); // bert
Paste_Image.png

3、參數(shù)傳遞

ECMAScript中所有的函數(shù)的參數(shù)都是按值傳遞的。也就是說,把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。

在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量(即命名參數(shù),或者用ECMAScript的概念來說,就是arguments對(duì)象中的一個(gè)元素)。

4、類型檢測

typeof

typeof 操作符是確定一個(gè)變量是字符串、數(shù)值、布爾值、還是undefined的最佳工具。

如果變量的值是一個(gè)對(duì)象或null,則typeof操作符會(huì)像下面例子中所示的那樣返回 object

var a = "Bert";
var b = true;
var c = 22;
var d;
var e = null;
var f = new Object();

alert(typeof a); // string
alert(typeof b); // boolean
alert(typeof c); // number
alert(typeof d); // undefined
alert(typeof e); // object
alert(typeof f); // object

instanceof

檢測引用類型使用 instanceof 操作符

如果變量是引用類型(根據(jù)它的原型鏈來識(shí)別) instanceof 返回 true 或 false

alert(person instanceof Object); // 變量 person 是 Object 類型嗎?
alert(colors instanceof Array); // 變量 colors 是 Array 類型嗎?
alert(pattern instanceof RegExp); // 變量 pattern 是 RegExp 類型嗎?

注意,匹配的對(duì)象首字母大寫

5、執(zhí)行環(huán)境及作用域

執(zhí)行環(huán)境是JavaScript中最為重要的一個(gè)概念。(執(zhí)行環(huán)境有全局執(zhí)行環(huán)境和函數(shù)執(zhí)行環(huán)境之分)

執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定他們各自的行為。

每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的 變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。

雖然我們編寫的代碼無法訪問這個(gè)對(duì)象,單解析器在處理數(shù)據(jù)時(shí)會(huì)在后臺(tái)使用它。

在 Web 瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象(全局執(zhí)行環(huán)境值到應(yīng)用程序退出,例如關(guān)閉網(wǎng)頁或?yàn)g覽器時(shí)才會(huì)被銷毀)

函數(shù)(執(zhí)行環(huán)境)

每個(gè)函數(shù)第一頁租戶的 執(zhí)行環(huán)境。 當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí)(執(zhí)行一個(gè)函數(shù)),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中。

在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。(假設(shè)之前的執(zhí)行環(huán)境仍是一個(gè)函數(shù),那么就會(huì)循環(huán)釋放直至根環(huán)境)

作用域鏈

當(dāng)代碼在一個(gè)執(zhí)行環(huán)境中執(zhí)行時(shí),會(huì)創(chuàng)建變量對(duì)象的一個(gè) 作用域鏈。作用域鏈的用途是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。

那 this 和 作用域鏈 的關(guān)系如何解釋?

作用域鏈的前端始終都是單簽執(zhí)行的代碼所在環(huán)境的變量對(duì)象。

如果這個(gè)環(huán)境是函數(shù),則將其 活動(dòng)對(duì)象 作為變量對(duì)象。活動(dòng)對(duì)象在最開始時(shí)只包含一個(gè)變量,即 arguments 對(duì)象(這個(gè)對(duì)象在全局環(huán)境中是不存在的)。

簡單來說作用域鏈?zhǔn)且粚右粚訌母恋椎臉湫谓Y(jié)構(gòu),底層可以訪問頂層的數(shù)據(jù),而頂層無法訪問底層的數(shù)據(jù)(勞資我出生的時(shí)候怎么會(huì)知道自己將來會(huì)生幾個(gè)兒子??! 放過來說做兒子的肯定知道自己的勞資是誰)

延長作用域鏈

  • try - catch 語句的 catch 塊
  • with語句

這兩個(gè)語句都會(huì)在作用域鏈的前端添加一個(gè)變量對(duì)象。

with:會(huì)將制定的對(duì)象添加到作用域鏈中。

catch:會(huì)創(chuàng)建一個(gè)新的變量對(duì)象,其中包含的是被拋出的錯(cuò)誤對(duì)象聲明。

沒有塊級(jí)作用域

JavaScript 沒有塊級(jí)作用。

  • 在if、for語句中聲明的變量會(huì)被保存在當(dāng)前執(zhí)行環(huán)境中,在其執(zhí)行結(jié)束時(shí)不會(huì)被銷毀。
  • 不使用 var 聲明的變量默認(rèn)綁定到全局環(huán)境中。

6、垃圾回收、性能問題

在有的瀏覽器中可以出發(fā)垃圾收集過程(不建議使用)

  • 用 window.CollectGarbage()方法會(huì)立即執(zhí)行垃圾收集。
  • 在Opera7及更高版本中,調(diào)用 window.opera.collect()也會(huì)啟動(dòng)垃圾收集例程。

有那么一點(diǎn)意思..

有垃圾回收機(jī)制的語言編寫程序一般不必操心內(nèi)存管理問題。

出于安全考慮,Web瀏覽器可用內(nèi)存數(shù)量通常要少于桌面應(yīng)用。因此,確保占用最少的內(nèi)容可以讓頁面獲得更好的性能。

優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。一旦數(shù)據(jù)不再有用,最好通過將其值設(shè)置為null來釋放其引用 ---- 這個(gè)做法叫做 解除引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,136評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,452評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,292評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,510評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,721評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,235評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,480評(píng)論 2 379

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