(Translated by https://www.hiragana.jp/)
JavaScript的内存模型 · Issue #28 · Vibing/blog · GitHub
Skip to content
New issue

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てきないそん模型もけい #28

Open
Vibing opened this issue Aug 11, 2020 · 0 comments
Open

JavaScriptてきないそん模型もけい #28

Vibing opened this issue Aug 11, 2020 · 0 comments

Comments

@Vibing
Copy link
Owner

Vibing commented Aug 11, 2020

うちそんてき生命せいめい周期しゅうき

JavaScriptさく为一门高级编程语言,ぞう其他语言(れい如C语言)需要じゅよう开发しゃしゅ动的管理かんりないそんざい JavaScript ちゅうけい统会动为你分配ぶんぱいないそんざい几乎にんなんいち种语ごとちゅううちそんてき生命せいめい周期しゅうき主要しゅようぶんさん个阶だん

  • うちそん分配ぶんぱい:一般由操作系统分配内存,ざいゆうてき语言ちゅう需要じゅよう开发しゃしゅ操作そうさ
  • 使用しようないそん:获得操作そうさけい分配ぶんぱいてきないそんきさきざいないそんちゅう发生读和うつしてき操作そうさ
  • 释放ないそんざいほどじょ使用しようかんないそんきさきかいはた部分ぶぶんないそん释放掉供其他ほどじょ使用しようざい 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

遗忘てきてい时器かい

常用じょうようてきてい时器,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 收集しゅうしゅう回收かいしゅう

闭包てき使用しよう

闭包内部ないぶ函数かんすう使用しよう外部がいぶ函数かんすうてき变量

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 きょうとおる

该闭つつみてき形成けいせい阻止そしりょうoThingてき回收かいしゅう

而且ざいてい时器ちゅう循环执行,thingまとないそんだい小将こしょうかい稳定ぞう长,而且ごと个作よういき间接引用いんようりょういちlongStr这个大数たいすう组,造成ぞうせいりょう相当そうとうだいてきないそん泄漏。

DOMてき引用いんよう

const elements = {
    button: document.getElementById('button'),
    image: document.getElementById('image')
}

function setSrc() {
    elements.image.src = 'http://exmaple.com/image_name.jpg'
}

function removeImage(){
    // imagebody元素げんそてき直接ちょくせつ元素げんそ
    document.body.removeChild( document.getElementById('image') )
    // 此时,虽然 image 元素げんそ删了,ただし全局ぜんきょく对象ちゅう仍然引用いんよう#image,仍在ないそんちゅう,GC无法收集しゅうしゅう
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant