亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

wuyangchun / 1038人閱讀

摘要:變量作用域和內(nèi)存問題基本類型和引用類型的值基本類型就是簡單的數(shù)據(jù)段種值類型,而引用類型就是對象操控對象的引用。但是不但能訪問自己的變量,也能訪問和全局作用域下的變量。延長作用域鏈相當(dāng)于創(chuàng)造了一個(gè)新的變量對象在當(dāng)前作用域的上方。

變量作用域和內(nèi)存問題 1.基本類型和引用類型的值
基本類型就是簡單的數(shù)據(jù)段(5種值類型),而引用類型就是對象(操控對象的引用)。
1.1復(fù)制變量值

引用類型實(shí)際上在復(fù)制的時(shí)候,傳遞的是函數(shù)的指針,復(fù)制完成后,實(shí)際兩個(gè)變量引用的都是同一個(gè)堆內(nèi)存中的對象,改變這個(gè)對象,兩個(gè)變量的值也會(huì)同步改變。

1.2傳遞參數(shù)

函數(shù)的參數(shù)都是按值傳遞的。其實(shí)我認(rèn)為這種說法多少還是有些抽象??偨Y(jié)起來不如這樣說。當(dāng)傳遞給函數(shù)的變量是值類型時(shí),那么傳遞給函數(shù)的這個(gè)原始變量的不會(huì)隨函數(shù)內(nèi)部的影響而改變。當(dāng)傳遞給函數(shù)的變量是引用類型(object)時(shí),那么傳遞給函數(shù)的這個(gè)原始變量的引用不會(huì)隨函數(shù)內(nèi)部的影響而改變。其實(shí)這里不是太容易理解,比如舉個(gè)例子來說明

        var obj = {
            name: "andy"
        }

        function ChangeObj(val) {
            val.age = "25"
            val = {
                name:"zakas",
                age:40
            }
            return val;
        }
        ChangeObj(obj); // {name:"zakas",age:40}
        console.log(obj) // {name:"andy",age:25}
        
      

上面這個(gè)例子中,函數(shù)中val的內(nèi)存地址變了(引用變了),如果函數(shù)是按引用傳遞的話,那么val的引用就是obj的引用,val的應(yīng)用變了,obj的引用也會(huì)跟隨變化,所以obj的結(jié)果也應(yīng)該是{name:"zakas",age:40}。而按值傳遞的話,obj賦值給val它的引用,但是他倆的引用是不關(guān)聯(lián)在一起的,val引用的改變并不會(huì)影響obj的引用地址。

函數(shù)的形參就是函數(shù)作用域中的局部變量。當(dāng)函數(shù)運(yùn)行完是會(huì)被銷毀的。

1.3檢測類型

instanceof 可以進(jìn)行引用類型的更明確的檢測。所以值類型在instanceof總?cè)莊alse,值類型也沒必要用其方法進(jìn)行檢測。instanceof只能區(qū)分Array Object 和 RegExp

2.執(zhí)行環(huán)境

每個(gè)執(zhí)行環(huán)境都有一個(gè)變量對象,變量對象的概念很重要。它是作用域中所有定義的變量的一個(gè)大的集合;每個(gè)執(zhí)行環(huán)境都有一個(gè)變量對象,存儲(chǔ)著我們定義的所有變量,但是這個(gè)變量對象我們訪問不到,但解析器處理數(shù)據(jù)時(shí)會(huì)在后臺(tái)使用它。

    function A() {
        var tempA;
        function B() {
            var tempB;
            function C() {
                var tempC
            }
        }
    }

B()的作用域鏈中包含3個(gè)對象,一個(gè)是自己的變量對象,還有A的變量對象和全局變量對象。A()中的作用域鏈包含2個(gè)對象,一個(gè)A()自己的變量對象,還有就是全局變量對象。因此A訪問不了B的變量,只能訪問自己的和全局的變量。但是B不但能訪問自己的變量,也能訪問A和全局作用域下的變量。

2.1延長作用域鏈

with

With相當(dāng)于創(chuàng)造了一個(gè)新的變量對象在當(dāng)前作用域的上方。例如:

    var obj = {
        name:"andy",
        sex:"man",
        hobby:"game"
    }
    function fn() {
        with(obj) {
            fnName = name;
            fnSex = sex;
            fnHobby = hobby;
        }
        console.log(fnName,fnSex,fnHobby) // andy,man,game
    }
    fn()

With方法會(huì)造成性能的嚴(yán)重?fù)p失,所以一般不建議用

2.2無塊級(jí)作用域

必須要知道這個(gè)概念,作用和區(qū)別,最老生常談的一個(gè)問題:

for(var i =0 ; i < 10 ; i++ ) {
    setTimeout(function(){
        console.log(i);
    },0)
}

在理解這個(gè)問題的前提下,首先要知道定時(shí)器是異步的,即使是0,也要先放到緩存區(qū)中,當(dāng)其他程序自上而下執(zhí)行完畢之后再去調(diào)用。所以在其他程序自上而下執(zhí)行完畢之后,由于沒有塊級(jí)作用域,i是全局的,已經(jīng)變成10了,所以輸出10個(gè)10。如果把i改為存在塊級(jí)作用域的let,那么問題就迎刃而解了。

for(let i =0 ; i < 10 ; i++ ) {
    setTimeout(function(){
        console.log(i);
    },0)
}
2.3垃圾收集

JavaScript具有自動(dòng)垃圾收集機(jī)制

使用值的過程中,其實(shí)是相當(dāng)于對變量分配的內(nèi)存進(jìn)行寫入和讀取的操作。JavaScript在創(chuàng)建變量的過程會(huì)分配內(nèi)存,當(dāng)變量不用時(shí)會(huì)自動(dòng)釋放掉,這個(gè)過程叫做垃圾回收機(jī)制,但是這個(gè)自動(dòng)是混亂的根源,很多開發(fā)者因此覺得不用太關(guān)心內(nèi)存問題,這是錯(cuò)誤的。

原理:垃圾處理器會(huì)在默認(rèn)情況下周期的進(jìn)行檢測,找出那些不用的變量,然后釋放其內(nèi)存。
回收策略:在局部環(huán)境中,函數(shù)調(diào)用完之后,垃圾收集器會(huì)跟蹤哪個(gè)變量有用,哪個(gè)變量沒有用,對于沒用的變量,打上標(biāo)記,以備回收其內(nèi)存,但是標(biāo)記的方法通常有另兩個(gè)策略:

標(biāo)記清除:從2012年起,所有瀏覽器全部使用標(biāo)記清除的方法進(jìn)行垃圾回收,并且所有對js垃圾回收的改進(jìn)也是基于標(biāo)記清除的方法進(jìn)行算法優(yōu)化。

引用計(jì)數(shù):這個(gè)由于存在嚴(yán)重的循環(huán)引用問題,所以現(xiàn)在已經(jīng)基本不用了。

因此,當(dāng)寫的程序占用較少的內(nèi)存是高性能頁面的一個(gè)很重要的點(diǎn)。所以當(dāng)我們寫程序時(shí)候,一旦數(shù)據(jù)不用了,最好設(shè)置成null來解除引用

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/96546.html

相關(guān)文章

  • 《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》——變量、作用域和內(nèi)存問題(四)

    摘要:執(zhí)行環(huán)境的類型有兩種全局全局執(zhí)行環(huán)境局部函數(shù)執(zhí)行環(huán)境每個(gè)環(huán)境都可以向上搜索作用域鏈,以查詢變量和函數(shù)名但任何環(huán)境都不能通過向下搜索作用域鏈而進(jìn)入另一個(gè)執(zhí)行環(huán)境。內(nèi)部可通過作用域鏈訪問外部,外部不能訪問內(nèi)部。 變量、作用域和內(nèi)存問題 ECMAScript 數(shù)據(jù)類型 基本類型(5種): Undefined,Null,Boolean,Number,String typeof() 檢測...

    YacaToy 評(píng)論0 收藏0
  • 變量、作用域和內(nèi)存問題

    摘要:使用聲明的變量會(huì)動(dòng)被添加到最近的環(huán)境中查詢標(biāo)識(shí)符,現(xiàn)在作用域鏈的最前端開始搜索,逐步向上級(jí)查詢,直到找到匹配的標(biāo)識(shí)符,在變量查詢中,訪問局部變量要比全局變量更快,因?yàn)椴恍枰蛏纤阉髯饔糜颉? 基本類型和引用類型的值 基本類型值指的是簡單的數(shù)據(jù)段;引用類型值指那些可能由多個(gè)值構(gòu)成的對象。不能給基本類型添加屬性,可以給引用類型值動(dòng)態(tài)的添加屬性。 基本類型按值訪問,存放在棧內(nèi)存中。引用類型按引...

    lentrue 評(píng)論0 收藏0
  • JavaScript紅寶書筆記(四)---變量、作用域和內(nèi)存問題

    摘要:在操作對象時(shí),實(shí)際上是在操作對象的引用而不是實(shí)際的對象。為此,引用類型的值是按引用訪問的。標(biāo)記清除是目前主流的垃圾收集算法,這種算法的思想是給當(dāng)前不使用的值加上標(biāo)記,然后再回收其內(nèi)存 1.在操作對象時(shí),實(shí)際上是在操作對象的引用而不是實(shí)際的對象。為此,引用類型的值是按引用訪問的。 2.當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值時(shí),兩個(gè)變量實(shí)際上將引用同一個(gè)對象,因此,改變其中一個(gè)變量,就會(huì)...

    imtianx 評(píng)論0 收藏0
  • 高程(第四章) 變量作用域和內(nèi)存問題

    摘要:不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時(shí),實(shí)際上是在操作對象的引用而不是實(shí)際的對象。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運(yùn)行時(shí)將其回收 1 基本類型和引用類型的值 基本數(shù)據(jù)類型是按值訪問的,因?yàn)榭梢圆僮鞅4嬖谧兞恐械膶?shí)際的值 基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中 引用類型的值是保存在內(nèi)存中的對象。JavaSc...

    xavier 評(píng)論0 收藏0
  • JavaScript變量作用域和內(nèi)存問題

    摘要:全局變量是最外圍的一個(gè)執(zhí)行環(huán)境,代碼在環(huán)境中執(zhí)行,會(huì)創(chuàng)建一個(gè)作用域鏈,用途是保證對執(zhí)行環(huán)境有權(quán)訪問所有變量和函數(shù)的有序訪問。作用域鏈中最后一個(gè)對象始終是全局執(zhí)行環(huán)境。內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,外部則不能訪問內(nèi)部。 1、基本類型和引用類型的值 * 基本類型 : 指的是簡單的數(shù)據(jù)段,五種基本類型是按值訪問的,可以直接操作保存在變量中實(shí)際的值。 * 引用類型 : 指那些可能...

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

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

0條評(píng)論

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