摘要:將作用域賦值給變量這里的作用域是,而不是將作用域賦值給一個(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
摘要:那其實(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)...
摘要:不是引用類型,無(wú)法輸出簡(jiǎn)而言之,堆內(nèi)存存放引用值,棧內(nèi)存存放固定類型值。變量的查詢?cè)谧兞康牟樵冎?,訪問局部變量要比全局變量來(lái)得快,因此不需要向上搜索作用域鏈。 贊助我以寫出更好的文章,give me a cup of coffee? 2017最新最全前端面試題 基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內(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)存泄漏的問題。 淺...
摘要:在運(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)存...
摘要:將他們放在堆中是為了不影響棧的效率。接著是臨時(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í)行,從上到下,就近原則。閉包可以讓外部...
閱讀 1037·2023-04-25 15:42
閱讀 3637·2021-11-02 14:38
閱讀 2918·2021-09-30 09:48
閱讀 1469·2021-09-23 11:22
閱讀 3449·2021-09-06 15:02
閱讀 3214·2021-09-04 16:41
閱讀 631·2021-09-02 15:41
閱讀 2047·2021-08-26 14:13