国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

wuyangchun / 976人閱讀

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

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

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

1.2傳遞參數(shù)

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

        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ù)是按引用傳遞的話(huà),那么val的引用就是obj的引用,val的應(yīng)用變了,obj的引用也會(huì)跟隨變化,所以obj的結(jié)果也應(yīng)該是{name:"zakas",age:40}。而按值傳遞的話(huà),obj賦值給val它的引用,但是他倆的引用是不關(guān)聯(lián)在一起的,val引用的改變并不會(huì)影響obj的引用地址。

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

1.3檢測(cè)類(lèi)型

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

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

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

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

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

2.1延長(zhǎng)作用域鏈

with

With相當(dāng)于創(chuàng)造了一個(gè)新的變量對(duì)象在當(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無(wú)塊級(jí)作用域

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

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

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

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

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

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

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/96546.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

0條評(píng)論

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