第4章 變量吆鹤、作用域和內(nèi)存問題

JS變量松散類型的本質(zhì),決定了它只是在特定時間用于保存特定值的一個名字而已

4.1 基本類型和引用類型的值
基本類型:按值傳遞
引用類型:JS不允許直接操作對象的內(nèi)存空間薇正,所以引用類型是按引用訪問的

4.1.1 復(fù)制變量值
基本類型:num2中的5和num1中的5是完全獨立的

    var num1 = 5;
    var num2 = num1;
    num1 = 6;

    num1 ==> 6 
    num2 ==> 5
引用類型:兩個變量實際上引用同一個對象柑晒,改變其中一個欧瘪,就會影響另一個;
    var obj1 = {};
    var obj2 = obj1;
    obj1.name = 'jack';
    obj2.name ==> 'jack'

4.1.2 傳遞參數(shù)
訪問變量有按值和按引用兩種方式匙赞,而所有函數(shù)的參數(shù)都是按值傳遞

    function addTen(num){
        num += 10;
        return num
    }

    var count = 20;
    var result = addTen(count);

    count ==> 20 // 沒有變化
    result ==> 30
使用對象傳參
   function setName(obj){
       obj.name = 'www'
    }

    var person = new Object();
    setName(person);

    person.name ==> 'www'
在這個函數(shù)內(nèi)部佛掖,obj和person引用的是用一個對象
    function setName(obj){
       obj.name = 'wwww';
       obj = {};
       obj.name = 'greg';
    }

    var person = {};
    setName(person);

    person.name ==> 'www'
即使在函數(shù)內(nèi)部修改了參數(shù)的值,但原始的引用仍然保持不變涌庭。當(dāng)在函數(shù)內(nèi)部重寫了obj時芥被,

這個變量引用的就是一個局部對象了,這個局部對象
會在函數(shù)執(zhí)行完畢后立即被銷毀坐榆;

所有的這些都說明拴魄,函數(shù)參數(shù)是按值傳遞的,函數(shù)的參數(shù)一定程度上說是局部變量猛拴;

4.1.3 檢測類型
檢測字符串羹铅,數(shù)值蚀狰,布爾愉昆,undefined,用typeof
typeof檢測引用類型值都返回Object

    typeof null ==> 'object';

使用typeof 檢測undefined會出現(xiàn)一個問題:

var name;
var sex = undefined;

typeof name  ==> undefined  //檢測定義了未賦值變量name為undefined
typeof age   ==>  //檢測未定義變量age 麻蹋,返回undefined
typeof sex ==>  //檢測值為undefined的變量sex跛溉,返回undefined

這個可能會造成一些混亂,所以確保只有未定義時扮授,才返回undefined芳室。其他兩種情況,請盡量避免刹勃。

檢測引用類型:instanceof
    var arr = [];
    arr instanceof Array ==> true
使用instanceof檢測基本類型堪侯,則始終會返回false,因為基本類型不是對象

4.2 執(zhí)行環(huán)境和作用域
執(zhí)行環(huán)境:定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù)荔仁,決定了他們各自的行為伍宦;
局部環(huán)境在執(zhí)行完畢后芽死,其中的變量和函數(shù)定義也會被銷毀
全局環(huán)境在應(yīng)用程序退出,關(guān)閉網(wǎng)頁或退出瀏覽器時次洼,其中的變量和函數(shù)定義會被銷毀

每個函數(shù)都有自己的執(zhí)行環(huán)境关贵。當(dāng)執(zhí)行流進入到一個函數(shù)中時,

函數(shù)的環(huán)境會被推入一個環(huán)境棧中卖毁,而在函數(shù)執(zhí)行之后揖曾,棧將其環(huán)境彈出,把控制權(quán)還給之前的執(zhí)行環(huán)境亥啦。

每個環(huán)境都可以向上搜索作用域鏈炭剪,以查詢變量和函數(shù)名,但任何環(huán)境都不能通過向下搜索作用域鏈而進入另一個執(zhí)行環(huán)境

4.2.1 延長作用域鏈

    try-catch
    with語句

4.2.2 沒有塊級作用域

     if(true) {
        var color = 'blue'
     }
     alert(color) ==> 'blue'
 由于不存在塊級作用域翔脱,所以if語句的變量聲明會將變量添加到當(dāng)前的執(zhí)行環(huán)境(這里是全局環(huán)境)
     for (var i = 0; i < 10; i ++) {
        doSomething(i)
     }

     alert(i) ==> 10
 由于不存在塊級作用域念祭,由for語句創(chuàng)建的變量i即使在for循環(huán)執(zhí)行結(jié)束后,

也依舊會存在于循環(huán)外部的執(zhí)行環(huán)境中

 1. 聲明變量
 使用var聲明的變量會自動被添加到最接近的環(huán)境中碍侦,在函數(shù)內(nèi)部叫潦,

最接近的環(huán)境就是函數(shù)的局部環(huán)境途戒,未經(jīng)var聲明過的變量,會被自動添加到全局環(huán)境中,

4.3 垃圾收集
javascript具有自動垃圾收集機制笨腥,執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存,所需內(nèi)存的分配以及無用內(nèi)存的回收完全實現(xiàn)了自動管理娜庇。
這種垃圾收集機制原理:找出那些不再繼續(xù)使用的變量炫贤,然后釋放其占用的內(nèi)存;

怎么樣找到哪些變量將不再被繼續(xù)使用尔邓?

垃圾收集器必須跟蹤哪個變量有用哪個沒有用晾剖,對于不再有用的變量打上標(biāo)記,以備將來收回其占用的內(nèi)存梯嗽;

用于標(biāo)示無用變量的兩個策略:

4.3.1 標(biāo)記清除:
在變量進入環(huán)境和離開環(huán)境時齿尽,分別為其添加標(biāo)記,清除離開的變量灯节,釋放內(nèi)存循头;

4.3.2 引用計數(shù)(不太常用)

4.3.3 性能問題

4.3.4 管理內(nèi)存
js在進行內(nèi)存管理和垃圾收集時面臨一個問題,js分配給web瀏覽器的可用內(nèi)存數(shù)量通常要比分配給桌面應(yīng)用的少炎疆,這樣做是出于安全考慮卡骂,防止運行js的網(wǎng)頁耗盡全部系統(tǒng)系統(tǒng)內(nèi)存而導(dǎo)致系統(tǒng)崩潰,因此形入,確保占用最少內(nèi)存可以讓頁面獲得更好的性能全跨;

優(yōu)化內(nèi)存最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)亿遂,一旦數(shù)據(jù)不再有用浓若,

最好通過將其設(shè)置為null來釋放其引用盒使,這個方法叫做解除引用,這一做法
適用于大多數(shù)全局變量和全局對象的引用七嫌,因為局部變量會在它們離開執(zhí)行環(huán)境時自動被解除引用少办;

如下例:
    function createPerson(name){
        var localPerson = new Object();
        localPerson.name = name;
        return localPerson;
    }

    var globalPerson = createPerson('wang');

    //手工解除globalPerson的引用

    globalPerson = null;
解除引用的真正目的是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運行時將其回收诵原;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末英妓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绍赛,更是在濱河造成了極大的恐慌蔓纠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吗蚌,死亡現(xiàn)場離奇詭異腿倚,居然都是意外死亡,警方通過查閱死者的電腦和手機蚯妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門敷燎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箩言,你說我怎么就攤上這事硬贯。” “怎么了陨收?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵饭豹,是天一觀的道長。 經(jīng)常有香客問我务漩,道長拄衰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任饵骨,我火速辦了婚禮翘悉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宏悦。我一直安慰自己镐确,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布饼煞。 她就那樣靜靜地躺著,像睡著了一般诗越。 火紅的嫁衣襯著肌膚如雪砖瞧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天嚷狞,我揣著相機與錄音块促,去河邊找鬼荣堰。 笑死,一個胖子當(dāng)著我的面吹牛竭翠,可吹牛的內(nèi)容都是我干的振坚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斋扰,長吁一口氣:“原來是場噩夢啊……” “哼渡八!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起传货,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屎鳍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后问裕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逮壁,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年粮宛,在試婚紗的時候發(fā)現(xiàn)自己被綠了窥淆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡巍杈,死狀恐怖祖乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秉氧,我是刑警寧澤眷昆,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汁咏,受9級特大地震影響亚斋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攘滩,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一帅刊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漂问,春花似錦赖瞒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磷仰,卻和暖如春袍嬉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工伺通, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箍土,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓罐监,卻偏偏與公主長得像吴藻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子弓柱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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