We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JavaScript作さく为一门高级编程语言,不ふ像ぞう其他语言(例れい如C语言)需要じゅよう开发者しゃ手しゅ动的去さ管理かんり内ない存そん,在ざい JavaScript 中ちゅう,系けい统会自じ动为你分配ぶんぱい内ない存そん,在ざい几乎任にん何なん一いち种语言ごと中ちゅう,内うち存そん的てき生命せいめい周期しゅうき主要しゅよう分ぶん三さん个阶段だん:
JavaScript数すう据すえ类型分ぶん两大类:基本きほん类型、引用いんよう类型。 字じ符ふ串くし、数字すうじ、布ぬの尔值等とう属ぞく于基本きほん类型,对象类型都と属ぞく于引用いんよう类型。
栈是ぜ一いち种先进后出で、后きさき进先出で的てき数すう据すえ结构, 举个例れい子こ,乒乓球だま盒子(先さき进后出で,后きさき进先出で):
栈
堆うずたか是ぜ一いち种树的てき结构,所以ゆえん它是“无序”的てき,可か以从任にん何なん地方ちほう将しょう数すう据すえ取ど出来でき,比ひ如书架か里さと的てき书
堆うずたか
// 基本きほん类型 const a = 'hello world'; // 引用いんよう类型 const obj = {}
栈内存そん中ちゅう存そん的てき数すう据すえ大小だいしょう必须是ぜ固定こてい的てき,所以ゆえん基本きほん类型都会とかい存そん储在栈内存そん中ちゅう,这种存そん储方式しき属ぞく于简单存储,也叫静せい态内存そん,所以ゆえん它的效率こうりつ是ぜ很高的てき。
栈内存そん
堆うずたか内うち存そん中ちゅう存そん的てき是ぜ引用いんよう类型的てき对象数すう据すえ,比ひ如 JSON、Function、Array 等とう等とう,因いん为引用いんよう类型数すう据すえ没ぼつ有ゆう固定こてい大小だいしょう,所以ゆえん不能ふのう存在そんざい于栈内ない存そん,在ざい运行时的访问方式ほうしき是ぜ通どおり过存在そんざい栈内存そん里さと的てき指ゆび针(地ち址し)去さ堆うずたか里さと寻找对应的てき对象数すう据すえ,也称它为动态内ない存そん,堆うずたか内うち存そん的てき效率こうりつ是ぜ比ひ栈内存そん要よう低てい。
堆うずたか内うち存そん
我わが们在使用しよう引用いんよう类型数すう据すえ时,系けい统会在ざい栈内存そん中ちゅう存そん一いち个地址し,该地址し指向しこう堆うずたか内うち存そん空そら间中你需要よう找的对象。
常つね听说内ない存そん泄漏,到底とうてい什么是ぜ内ない存そん泄漏? 从本质上说,内ない存そん泄漏可か以定义为:不ふ再さい被ひ应用程ほど序じょ所しょ需要じゅよう的てき内ない存そん,出で于某种原因げんいん,它不会かい被ひGC回收かいしゅう
在ざい JavaScript 中ちゅう,对于没ぼつ有ゆう声明せいめい的てき变量,则会在ざい全局ぜんきょく范围中ちゅう创建一个新的变量并对其进行引用,在ざい浏览器き中ちゅう,全局ぜんきょく对象是ぜ window,例れい如:
function foo(arg) { bar = "some text"; this.book = 'JavaScript'; }
等とう价于:
function foo(arg) { window.bar = "some text"; window.book = 'JavaScript' }
如果这种意外いがい的てき全局ぜんきょく变量过多,则会导致内ない存そん溢出
你可以使用よう更さら严格的てきuse strict模も式しき来らい避免它,或ある者もの你必须能确保将はた其指定してい为null
use strict
null
常用じょうよう的てき定てい时器,比ひ如setInterval
setInterval
var serverData = loadData(); setInterval(function() { var renderer = document.getElementById('renderer'); if(renderer) { renderer.innerHTML = JSON.stringify(serverData); } }, 5000); //每まい五ご秒びょう会かい执行一いち次じ
定てい时器里さと有ゆう对 id 为 renderer 的てき DOM 进行引用いんよう,试想如果未来みらい在ざい某ぼう处将该 DOM 删掉,会かい导致定てい时器内部ないぶ的てき代だい码变得とく不ふ再さい需要じゅよう,但ただし由よし于定时器仍在运行,所以ゆえん导致里さと面めん的てき处理程ほど序じょ所しょ占うらない内ない存そん不能ふのう被ひ GC 回收かいしゅう,也意味いみ着ぎ serverData 不能ふのう被ひ回收かいしゅう。
所以ゆえん我わが们在不ふ适用定てい时器的てき时候,务必使用しようclearInterval将はた该定时器清きよし除じょ,断だん开其内部ないぶ代だい码的引用いんよう,可か以让 GC 收集しゅうしゅう和わ回收かいしゅう。
clearInterval
闭包是ぜ内部ないぶ函数かんすう使用しよう外部がいぶ函数かんすう的てき变量
let thing = null; const fun1 = function () { const oThing = thing; const unused = function () { if(oThing) // 引用いんよう了りょうoThing console.log('hi') } thing = { longStr: new Array(10000).join('*'), someMethod: function (){ console.log('message') } } } setInterval(fun1, 1000)
unused函数かんすう内ない引用いんよう了りょう外部がいぶ的てきoThing,在ざいfun1中ちゅう调用了りょうthing。 在ざいthing中なか,为 someMethod 创建的てき作用さよう域いき可か以被 unused 共きょう享とおる。
unused
oThing
fun1
thing
someMethod
该闭包つつみ的てき形成けいせい,阻止そし了りょうoThing的てき回收かいしゅう。
而且在ざい定てい时器中ちゅう被ひ循环执行,thing的まと内ない存そん大だい小将こしょう会かい稳定增ぞう长,而且每ごと个作用よう域いき都と间接引用いんよう了りょう一いち个longStr这个大数たいすう组,造成ぞうせい了りょう相当そうとう大だい的てき内ない存そん泄漏。
longStr
const elements = { button: document.getElementById('button'), image: document.getElementById('image') } function setSrc() { elements.image.src = 'http://exmaple.com/image_name.jpg' } function removeImage(){ // image是ぜbody元素げんそ的てき直接ちょくせつ子こ元素げんそ document.body.removeChild( document.getElementById('image') ) // 此时,虽然 image 元素げんそ被ひ删了,但ただし全局ぜんきょく对象中ちゅう仍然引用いんよう#image,仍在内ない存そん中ちゅう,GC无法收集しゅうしゅう它 }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
JavaScript作 为一门高级编程语言,不 像 其他语言(例 如C语言)需要 开发者 手 动的去 管理 内 存 ,在 JavaScript 中 ,系 统会自 动为你分配 内 存 ,在 几乎任 何 一 种语言 中 ,内 存 的 生命 周期 主要 分 三 个阶段 :
栈内存 和 堆 内 存
JavaScript数 据 类型分 两大类:基本 类型、引用 类型。
字 符 串 、数字 、布 尔值等 属 于基本 类型,对象类型都 属 于引用 类型。
栈
举个
栈内存
如果这种意外 的 全局 变量过多,则会导致内 存 溢出
你可以使用 更 严格的 模 式 来 避免它,或 者 你必须能确保将 其指定 为
use strict
null
setInterval
clearInterval
闭包的 使用
闭包是 内部 函数 使用 外部 函数 的 变量
unused
oThing
,fun1
thing
。thing
someMethod
创建unused
该闭包 的 形成 ,阻止 了 的 回收 。
oThing
而且在 定 时器中 被 循环执行,的 内 存 大 小将 会 稳定增 长,而且每 个作用 域 都 间接引用 了 一 个大数 组,造成 了 相当 大 的 内 存 泄漏。
thing
longStr
这个DOM的 引用
The text was updated successfully, but these errors were encountered: