成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談Javascript閉包中作用域及內(nèi)存泄漏問題

source / 531人閱讀

摘要:將作用域賦值給變量這里的作用域是,而不是將作用域賦值給一個(gè)變量閉包返回瀏覽器中內(nèi)存泄漏問題大家都知道,閉包會(huì)使變量駐留在內(nèi)存中,這也就導(dǎo)致了內(nèi)存泄漏。

上一章我們講了匿名函數(shù)和閉包,這次我們來(lái)談?wù)勯]包中作用域this的問題。

大家都知道,this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的,如果this在全局就是[object window],如果在對(duì)象內(nèi)部就是指向這個(gè)對(duì)象,而閉包卻是在運(yùn)行時(shí)指向的window,因?yàn)殚]包并不屬于這個(gè)對(duì)象的屬性和方法。
我們先來(lái)看一個(gè)例子關(guān)于全局作用域的問題:

var a = "this is window";

var box = {
    a:"this is object",
    get:function () {
        return this.a;
    }
};
alert(this.a);        //返回window.因?yàn)槭侨肿饔糜?/pre>

不難看出,這個(gè)時(shí)候,this的作用域是全局的。指向的是window.結(jié)合上句話來(lái)看例子,如果在對(duì)象內(nèi)部就是指向的這個(gè)對(duì)象。

var a = "this is window";

var box = {
    a:"this is object",
    get:function () {
        return this.a;
    }
};
alert(box.get());        //返回的是this is object 因?yàn)檫@個(gè)是box對(duì)象下的作用域

我們了解了作用域的問題。接下來(lái)我們就說說閉包中this對(duì)象作用域的問題:

var a = "this is window";

var box = {
    a:"this is object",
    get:function () {
        return function () {    //閉包
            retun this.a;    
        };
    }
};
alert(box.get()());        //返回this is window.

這就奇怪了,明明嵌套了這么多層,怎么會(huì)指向window呢,這就是閉包的機(jī)制,還是剛剛那句話:閉包卻是在運(yùn)行時(shí)指向的window,因?yàn)殚]包并不屬于這個(gè)對(duì)象的屬性和方法。

那我們?nèi)绾沃v閉包的作用域指針指向?qū)ο髢?nèi)部呢?
兩種方法:1.使用call()對(duì)象冒充,2.將作用域賦值給變量

/*對(duì)象冒充*/

var a = "this is window";

var box = {
    a:"this is object",
    get:function () {
        return function () {    //閉包
            retun this.a;    
        };
    }
};
alert(box.get().call(box));    //返回 this is object

使用call()傳值box,將box對(duì)象冒充。從而使作用域指向box對(duì)象內(nèi)部。

/*將作用域賦值給變量*/

var a = "this is window";

var box = {
    a:"this is object",
    get:function () {
    /*這里的作用域是box,而不是window*/
     var scope = this;    //將作用域賦值給一個(gè)變量
        return function () {    //閉包
            retun scope.a;    
        };
    }
};
alert(box.get()());    //返回this is object.

IE瀏覽器中內(nèi)存泄漏問題

大家都知道,閉包會(huì)使變量駐留在內(nèi)存中,這也就導(dǎo)致了內(nèi)存泄漏。但是只是針對(duì)IE瀏覽器,其他瀏覽器不會(huì)出現(xiàn)這種問題.

window.onload = function () {
    function box () {
    var div = document.getElementById("div");
    div.onclick = function () {
        alert(div.innerHTML);
    };
}
box();
};

這里的互相調(diào)用會(huì)導(dǎo)致IE瀏覽器內(nèi)存泄漏,因?yàn)閐iv.onclick引用了上面的var div,他倆互相引用導(dǎo)致內(nèi)存泄漏,解決辦法就是將用完的div賦值null,等待垃圾回收

window.onload = function () {
    function box () {
    var div = document.getElementById("div");
    var a = div.innerHTML;
    div.onclick = function () {
        alert(a);
    };
    a = null;    //賦值為null,等待垃圾回收
}
box();
};

如果沒有解除引用,必須等待瀏覽器關(guān)閉的時(shí)候才能釋放?。?!

關(guān)于作用域及內(nèi)存泄漏的文章就到這里,歡迎老司機(jī)指正錯(cuò)誤!

                                                                                                                   Brian Lee

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81002.html

相關(guān)文章

  • 圖解作用域及閉包

    摘要:那其實(shí)閉包的原因就是外層函數(shù)的作用域?qū)ο鬅o(wú)法釋放其實(shí)就是一個(gè)函數(shù)調(diào)用會(huì)生成的臨時(shí)作用域圖中可看出其實(shí)就是在中的匿名函數(shù),所以他的就指向留下的作用域。 引言 網(wǎng)絡(luò)上關(guān)于作用域及閉包的文章很多,自己對(duì)于純理論知識(shí)并不能很快的理解,但自己對(duì)于圖畫有很強(qiáng)的記憶和理解能力,因此決定將此知識(shí)點(diǎn)以圖畫的知識(shí)表現(xiàn)出來(lái),加深自身理解的同時(shí)如果能幫到正在學(xué)習(xí)的童鞋就再好不過了 下面我以函數(shù)的整個(gè)生命周期來(lái)...

    shiyang6017 評(píng)論0 收藏0
  • 詳解js變量、作用域及內(nèi)存

    摘要:不是引用類型,無(wú)法輸出簡(jiǎn)而言之,堆內(nèi)存存放引用值,棧內(nèi)存存放固定類型值。變量的查詢?cè)谧兞康牟樵冎?,訪問局部變量要比全局變量來(lái)得快,因此不需要向上搜索作用域鏈。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內(nèi)存中占有固定的大小空...

    waltr 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScript內(nèi)存泄漏

    摘要:接上回我寫了一篇關(guān)于閉包的博客學(xué)習(xí)之閉包,最后談到閉包導(dǎo)致的問題時(shí)留了一個(gè)尾在以下的瀏覽器中會(huì)有內(nèi)存泄漏的問題。今天的博客就繼續(xù)探索一下內(nèi)存泄漏的問題。博客地址的前端之路原文鏈接學(xué)習(xí)之內(nèi)存泄漏 接上回我寫了一篇關(guān)于閉包的博客《學(xué)習(xí)JavaScript之閉包》, 最后談到閉包導(dǎo)致的問題時(shí)留了一個(gè)尾: 在IE9以下的瀏覽器中會(huì)有內(nèi)存泄漏的問題。 今天的博客就繼續(xù)探索一下內(nèi)存泄漏的問題。 淺...

    nodejh 評(píng)論0 收藏0
  • 【前端進(jìn)階之路】內(nèi)存基本知識(shí)

    摘要:在運(yùn)行腳本時(shí),需要顯示的指定對(duì)象。大對(duì)象區(qū)每一個(gè)區(qū)域都是由一組內(nèi)存頁(yè)構(gòu)成的。這里是唯一擁有執(zhí)行權(quán)限的內(nèi)存區(qū)。換句話說,是該對(duì)象被之后所能回收到內(nèi)存的總和。一旦活躍對(duì)象已被移出,則在舊的半空間中剩下的任何死亡對(duì)象被丟棄。 內(nèi)存管理 本文以V8為背景 對(duì)之前的文章進(jìn)行重新編輯,內(nèi)容做了很多的調(diào)整,使其具有邏輯更加緊湊,內(nèi)容更加全面。 1. 基礎(chǔ)概念 1.1 生命周期 不管什么程序語(yǔ)言,內(nèi)存...

    Simon_Zhou 評(píng)論0 收藏0
  • 淺談js內(nèi)存閉包

    摘要:將他們放在堆中是為了不影響棧的效率。接著是臨時(shí)空間函數(shù)執(zhí)行的時(shí)候,會(huì)臨時(shí)開辟一塊內(nèi)存空間,這塊內(nèi)存空間長(zhǎng)得和外面這個(gè)一樣,也有自己的棧堆,當(dāng)函數(shù)運(yùn)行完就銷毀。中的內(nèi)存第一個(gè)部分還是和上面的一樣,有棧堆運(yùn)行時(shí)環(huán)境,另外還有一個(gè)緩沖區(qū)存放。 0.前言 主要結(jié)合了內(nèi)存的概念講了js的一些的很簡(jiǎn)單、但是又不小心就犯錯(cuò)的地方。結(jié)論:js執(zhí)行順序,先定義,后執(zhí)行,從上到下,就近原則。閉包可以讓外部...

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

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

0條評(píng)論

閱讀需要支付1元查看
<